1 VÉRIFICATION ET VALIDATION RCBA - DONNÉES D’HABITAT

Environnement et changement climatique Canada

Analyse réalisée le 2018-02-21 12:05:15


Ce document est un carnet de note écrit en Markdown R. Lorsque vous éxécuter le code intégré au carnet, les résulats apparaitront sous le code correspondant.

Ce rapport présente les résultats de la vérification et la validation des données biologiques pour le projet TestFr.

Dans cette analyse, le jeu de descripteurs biologiques sera vérifié pour répondre à la question suivante :

  • Les données biologiques correspondent-elles bien à ce qui a été observé sur le terrain ?

Ce document est un carnet de notes R Markdown. Pour obtenir les résultats de la vérification et la validation des données, exécutez les commandes contenues dans ce carnet de notes. Pour ce faire, positionnez votre curseur à l’intérieur d’une boîte de commandes et cliquez sur la flèche verte à la droite de celle-ci nommée Run Current Chunk ou appuyez sur les touches Ctrl+Maj+Entrée (Cmd-Maj+Entrée sur macOS) de votre clavier. Répétez pour chaque boîte de commandes. À mesure que les commandes contenues dans ce carnet seront exécutées, les résultats apparaîtront sous chacune des commandes correspondantes dans la présente fenêtre. Une fois toutes les commandes exécutées, cliquez sur le bouton Preview en haut à gauche de la présente fenêtre ou appuyer sur les touches Ctrl+Maj+K. Une nouvelle fenêtre apparaîtra et contiendra le rapport de ces résultats de la vérification et la validation des données générales RCBA.

1.1 Prérequis

1.2 Statistiques descriptives

Le fichier de données contient 448 visites (lignes) et 51 taxons (colonnes).

Le tableau suivant présente une partie des données du fichier.

Lecture des données biologiques

ACTION: Examinez les points suivants :

  • Le fichier semble-t’il avoir été lu correctement?
  • Des colonnes sont-elles manquantes?

Liste des visites présentes dans les données biologiques (ID provenant de la base de données RCBA) :

17215, 17216, 17217, 18368, 18375, 18364, 18493, 18495, 18496, 18758, 18759, 18760, 18546, 18548, 18549, 19013, 19017, 19018, 16962, 16965, 16966, 17363, 17364, 17365, 18839, 18841, 18845, 17492, 17493, 17494, 21911, 21925, 21926, 18328, 18329, 18330, 19971, 20219, 18632, 20220, 18628, 18630, 18631, 17496, 17497, 17498, 18889, 18890, 18892, 20302, 20303, 20304, 18663, 18664, 18665, 16863, 18796, 18798, 18799, 19070, 19072, 19082, 18718, 18723, 18724, 17241, 17248, 17253, 18693, 18826, 19044, 17272, 17273, 17274, 18787, 18790, 18791, 17522, 17568, 17573, 17436, 17437, 17438, 18378, 18449, 18459, 24059, 17450, 17456, 17461, 18747, 18748, 18750, 18730, 18732, 18734, 16913, 16914, 16919, 18300, 18301, 18302, 18499, 18498, 18497, 16921, 16922, 16923, 18296, 18298, 18299, 16849, 16853, 16854, 17412, 17413, 17418, 18545, 18735, 18736, 18667, 18678, 18692, 18666, 18681, 18682, 17502, 17565, 17570, 18622, 18623, 18624, 18821, 18823, 18824, 19037, 19042, 19043, 18542, 18543, 18544, 17443, 17444, 18901, 18903, 18904, 21846, 21850, 21854, 19045, 19046, 19048, 18331, 18332, 18333, 19038, 19040, 19041, 19069, 19073, 19084, 18757, 18830, 18832, 18610, 18611, 18616, 17472, 17476, 17477, 19086, 19087, 19088, 18891, 18893, 18899, 18753, 18777, 18780, 17463, 17465, 17466, 18828, 18829, 18894, 18803, 18805, 18806, 17488, 17490, 17491, 17569, 17575, 17578, 18922, 18977, 18996, 18923, 18927, 18929, 18482, 18483, 18484, 19015, 19016, 19014, 16934, 16935, 16936, 28210, 28212, 28213, 29505, 29506, 29507, 19033, 19035, 19036, 19075, 19077, 19078, 18475, 18479, 18480, 18453, 18454, 18455, 19094, 19096, 19098, 16907, 16908, 16911, 18661, 18662, 18782, 18743, 18770, 18774, 18711, 18716, 18717, 16867, 16868, 16866, 18695, 18696, 18766, 18655, 18658, 18659, 18763, 18768, 18769, 18520, 18524, 18525, 17483, 17487, 17489, 18772, 18773, 18775, 16945, 16961, 16967, 18644, 18669, 18677, 16834, 18310, 16833, 16832, 18843, 18844, 18846, 18701, 18702, 18703, 18687, 18689, 18691, 18800, 18801, 18802, 18519, 18522, 18523, 18372, 18373, 18374, 18647, 18648, 18649, 18618, 18619, 18620, 18476, 18477, 18478, 19002, 19049, 19011, 28315, 28316, 28317, 18785, 18786, 18789, 21909, 19089, 19090, 19091, 16852, 16858, 16859, 17591, 17597, 18450, 18451, 18452, 18868, 18895, 18896, 19101, 16898, 16903, 16900, 16893, 16991, 16992, 18674, 18676, 18679, 20305, 20307, 20308, 18719, 18720, 18721, 19547, 19548, 18456, 18457, 18458, 18468, 18469, 18470, 18461, 18463, 18464, 19079, 19080, 19083, 18781, 18850, 18851, 18783, 18835, 18842, 18994, 19001, 19004, 18836, 18837, 18838, 18516, 18538, 18541, 19071, 19076, 19093, 16839, 16840, 16844, 17471, 17475, 17478, 16841, 16843, 16845, 17479, 17481, 17482, 16860, 16861, 16862, 18722, 18725, 18726, 17571, 17572, 17574, 21967, 21973, 21975, 19064, 19067, 19092, 17126, 17132, 17133, 18937, 18938, 18939, 18807, 18361, 18362, 18363, 19068, 19074, 19085, 16927, 16928, 16929, 16836, 16837, 16838, 18792, 18793, 18795, 16924, 16925, 16926, 17390, 17393, 17394, 16905, 16915, 16916, 18365, 18366, 18367, 18303, 18305, 18306, 26032, 26033, 26036, 18737, 18740, 18741, 21950, 21963, 21977, 18756, 18761, 18762

ACTION: Examinez les points suivants :

  • La liste ci-haut correspond-t’elle avec le tableau suivant qui présente les visites présentes dans l’un ou l’autre des fichiers de données du projet TestFr?
Site SampleDate SampleNumber
17215 AA06221 2008-09-30 1
17216 AA06222 2008-09-29 1
17217 AA06223 2008-09-28 1
18368 AA09211 2008-09-30 1
18375 AA09212 2008-09-29 1
18364 AA09213 2008-09-28 1
18493 AB02061 2008-09-30 1
18495 AB02062 2008-09-29 1
18496 AB02063 2008-09-28 1
18758 AB05291 2008-09-30 1
18759 AB05292 2008-09-29 1
18760 AB05293 2008-09-28 1
18546 AC09201 2008-09-30 1
18548 AC09202 2008-09-29 1
18549 AC09203 2008-09-28 1
19013 AG03041 2008-09-30 1
19017 AG03042 2008-09-29 1
19018 AG03043 2008-09-28 1
16962 AJ08031 2008-09-30 1
16965 AJ08032 2008-09-29 1
16966 AJ08033 2008-09-28 1
17363 AKN04261 2008-09-30 1
17364 AKN04262 2008-09-29 1
17365 AKN04263 2008-09-28 1
18839 AM05271 2008-09-30 1
18841 AM05272 2008-09-29 1
18845 AM05273 2008-09-28 1
17492 AMI05221 2008-09-30 1
17493 AMI05222 2008-09-29 1
17494 AMI05223 2008-09-28 1
21911 AP04131 2008-09-30 1
21925 AP04132 2008-09-29 1
21926 AP04133 2009-09-28 1
18328 AP04181 2008-09-30 1
18329 AP04182 2008-09-29 1
18330 AP04183 2008-09-28 1
19971 AR092808 2008-09-28 1
20219 AR092908 2008-09-29 1
18632 AR09292 2008-09-29 1
20220 AR093008 2008-09-30 1
18628 AS09051 2008-09-30 1
18630 AS09052 2008-09-29 1
18631 AS09053 2008-09-28 1
17496 AS09191 2008-09-30 1
17497 AS09192 2008-09-29 1
17498 AS09193 2008-09-28 1
18889 AT05101 2008-09-30 1
18890 AT05102 2008-09-29 1
18892 AT05103 2008-09-28 1
20302 BH12261 2008-09-30 1
20303 BH12262 2008-09-29 1
20304 BH12263 2008-09-28 1
18663 BL110801 2008-09-30 1
18664 BL110802 2008-09-29 1
18665 BL110803 2008-09-28 1
16863 BR06231 2008-09-30 1
18796 BS07281 2008-09-30 1
18798 BS07282 2008-09-29 1
18799 BS07283 2008-09-28 1
19070 BT11071 2008-09-30 1
19072 BT11072 2008-09-29 1
19082 BT11073 2008-09-28 1
18718 BW09191 2008-09-30 1
18723 BW09192 2008-09-29 1
18724 BW09193 2008-09-28 1
17241 BW10111 2008-09-30 1
17248 BW10112 2008-09-29 1
17253 BW10113 2008-09-28 1
18693 BY05231 2008-09-30 1
18826 BY05232 2008-09-29 1
19044 BY05233 2008-09-28 1
17272 CD01231 2008-09-30 1
17273 CD01232 2008-09-29 1
17274 CD01233 2008-09-28 1
18787 CD08121 2008-09-30 1
18790 CD08122 2008-09-29 1
18791 CD08123 2008-09-28 1
17522 CD10141 2008-09-29 1
17568 CD10142 2008-09-29 1
17573 CD10143 2008-09-28 1
17436 CD10161 2008-09-30 1
17437 CD10162 2008-09-29 1
17438 CD10163 2008-09-28 1
18378 CG03161 2008-09-30 1
18449 CG03162 2008-09-29 1
18459 CG03163 2008-09-28 1
24059 CG08121 2008-09-30 1
17450 CH04191 2008-09-30 1
17456 CH04192 2008-09-29 1
17461 CH04193 2008-09-28 1
18747 CJ9271 2008-09-30 1
18748 CJ9272 2008-09-29 1
18750 CJ9273 2008-09-28 1
18730 CM05221 2008-09-30 1
18732 CM05222 2008-09-29 1
18734 CM05223 2008-09-28 1
16913 CM10301 2008-09-30 1
16914 CM10302 2008-09-29 1
16919 CM10303 2008-09-28 1
18300 CMH04191 2008-09-30 1
18301 CMH04192 2008-09-29 1
18302 CMH04193 2008-09-28 1
18499 CN09021 2008-09-30 1
18498 CN09022 2008-09-29 1
18497 CN09023 2008-09-28 1
16921 CO04141 2008-09-30 1
16922 CO04142 2008-09-29 1
16923 CO04143 2008-09-28 1
18296 CS08311 2008-09-30 1
18298 CS08312 2008-09-29 1
18299 CS08313 2008-09-28 1
16849 CT11041 2008-09-30 1
16853 CT11042 2008-09-29 1
16854 CT11043 2008-09-28 1
17412 DE06091 2008-09-30 1
17413 DE06092 2008-09-29 1
17418 DE06093 2008-09-28 1
18545 DJ0906101 2008-09-30 1
18735 DJ09062 2008-09-29 1
18736 DJ09063 2008-09-28 1
18667 DM04041 2008-09-30 1
18678 Dm04042 2008-09-29 1
18692 DM04043 2008-09-28 1
18666 DR06151 2008-09-30 1
18681 DR06152 2008-09-29 1
18682 DR06153 2008-09-28 1
17502 DS06121 2008-09-30 1
17565 DS06122 2008-09-29 1
17570 DS06123 2008-09-28 1
18622 DT06091 2008-09-30 1
18623 DT06092 2008-09-29 1
18624 DT06093 2008-09-28 1
18821 DW01311 2008-09-30 1
18823 DW01312 2008-09-29 1
18824 DW01313 2008-09-28 1
19037 EE06181 2008-09-30 1
19042 EE06182 2008-09-29 1
19043 EE06183 2008-09-28 1
18542 EJ12211 2008-09-30 1
18543 EJ12212 2008-09-29 1
18544 EJ12213 2008-09-28 1
17443 EK07041 2008-09-30 1
17444 EK07042 2008-09-29 1
18901 ER07011 2008-09-30 1
18903 ER07012 2008-09-29 1
18904 ER07013 2008-09-28 1
21846 ES06091 2008-09-30 1
21850 ES06092 2008-09-29 1
21854 ES06093 2008-09-28 1
19045 ES11131 2008-09-30 1
19046 ES11132 2008-09-29 1
19048 ES11133 2008-09-28 1
18331 EW03271 2008-09-30 1
18332 EW03272 2008-09-29 1
18333 EW03273 2008-09-28 1
19038 GH03161 2008-09-30 1
19040 GH03162 2008-09-29 1
19041 GH03163 2008-09-28 1
19069 GL05231 2008-09-30 1
19073 GL05232 2008-09-29 1
19084 GL05233 2008-09-28 1
18757 HK09283 2008-09-30 1
18830 HK09292 2008-09-29 1
18832 HK09301 2008-09-30 1
18610 HM02271 2008-09-30 1
18611 HM02272 2008-09-29 1
18616 HM02273 2008-09-28 1
17472 JB09271 2008-09-30 1
17476 JB09272 2008-09-29 1
17477 JB09273 2008-09-28 1
19086 JB12071 2008-09-30 1
19087 JB12072 2008-09-29 1
19088 JB12073 2008-09-28 1
18891 JB12251 2008-09-30 1
18893 JB12252 2008-09-29 1
18899 JB12253 2008-09-28 1
18753 JC051401 2008-09-30 1
18777 JC051402 2008-09-29 1
18780 JC051403 2008-09-28 1
17463 JD03231 2008-09-30 1
17465 JD03232 2008-09-29 1
17466 JD03233 2008-09-28 1
18828 JD10191 2008-09-30 1
18829 JD10192 2008-09-29 1
18894 JD10193 2008-09-28 1
18803 JJ03271 2008-09-30 1
18805 JJ03272 2008-09-29 1
18806 JJ03273 2008-09-28 1
17488 JJ06301 2008-09-30 1
17490 JJ06302 2008-09-29 1
17491 JJ06303 2008-09-28 1
17569 JL02061 2008-09-30 1
17575 JL02062 2008-09-29 1
17578 JL02063 2008-09-28 1
18922 JL09091 2008-09-30 1
18977 JL09092 2008-09-29 1
18996 JL09093 2008-09-28 1
18923 JM04621 2008-09-30 1
18927 JM04622 2008-09-29 1
18929 JM04623 2008-09-28 1
18482 JM11131 2008-09-30 1
18483 JM11132 2008-09-29 1
18484 JM11133 2008-09-28 1
19015 JP03271 2008-09-30 1
19016 JP03272 2008-09-29 1
19014 JP03273 2008-09-28 1
16934 JR02121 2008-09-30 1
16935 JR02122 2008-09-29 1
16936 JR02123 2008-09-28 1
28210 JR03271 2008-09-30 1
28212 JR03272 2008-09-29 1
28213 JR03273 2008-09-28 1
29505 JR12091 2008-09-30 1
29506 JR12092 2008-09-29 1
29507 JR12093 2008-09-28 1
19033 JR12211 2008-09-30 1
19035 JR12212 2008-09-29 1
19036 JR12213 2008-09-28 1
19075 JS10011 2008-09-30 1
19077 JS10012 2008-09-29 1
19078 JS10013 2008-09-28 1
18475 JS11111 2008-09-30 1
18479 JS11112 2008-09-29 1
18480 JS11113 2008-09-28 1
18453 JT05241 2008-09-30 1
18454 JT05242 2008-09-29 1
18455 JT05243 2008-09-28 1
19094 JT09091 2008-09-30 1
19096 JT09092 2008-09-29 1
19098 JT09093 2008-09-28 1
16907 KC10081 2008-09-30 1
16908 KC10082 2008-09-29 1
16911 KC10083 2008-09-28 1
18661 KC12141 2008-09-30 1
18662 KC12142 2008-09-29 1
18782 KC12143 2008-09-28 1
18743 KF06181 2008-09-30 1
18770 KF06182 2008-09-29 1
18774 KF06183 2008-09-28 1
18711 KK01041 2008-09-30 1
18716 KK01042 2008-09-29 1
18717 KK01043 2008-09-28 1
16867 KL08312 2008-09-29 1
16868 KL08313 2008-09-28 1
16866 KL09301 2008-09-30 1
18695 KM01051 2008-09-30 1
18696 KM01052 2008-09-29 1
18766 KM01053 2008-09-28 1
18655 KM03021 2008-09-30 1
18658 KM03022 2011-09-29 1
18659 KM03023 2008-09-28 1
18763 km07061 2008-09-30 1
18768 km07062 2008-09-29 1
18769 km07063 2008-09-28 1
18520 KM07121 2008-09-30 1
18524 KM07122 2008-09-29 1
18525 KM07123 2008-09-28 1
17483 KM1221 2008-09-30 1
17487 KM1222 2008-09-29 1
17489 KM1223 2008-09-28 1
18772 KP03021 2008-09-30 1
18773 KP03022 2008-09-29 1
18775 KP03023 2008-09-28 1
16945 KR04191 2008-09-30 1
16961 KR04192 2008-09-29 1
16967 KR04193 2008-09-28 1
18644 KR09021 2008-09-30 1
18669 KR09022 2008-09-29 1
18677 KR09023 2008-09-28 1
16834 KV12191 2008-09-30 1
18310 KV12191 2010-09-15 1
16833 KV12192 2008-09-29 1
16832 KV12193 2008-09-28 1
18843 kw01011 2008-09-30 1
18844 kw01012 2008-09-29 1
18846 kw01013 2008-09-28 1
18701 LC03051 2008-09-30 1
18702 LC03052 2008-09-29 1
18703 LC03053 2008-09-28 1
18687 LC10141 2008-09-30 1
18689 LC10142 2008-09-29 1
18691 LC10143 2008-09-28 1
18800 LL10171 2008-09-30 1
18801 LL10172 2008-09-29 1
18802 LL10173 2008-09-28 1
18519 LN03171 2008-09-30 1
18522 LN03172 2008-09-29 1
18523 LN03173 2008-09-28 1
18372 LP06091 2008-09-30 1
18373 LP06092 2008-09-29 1
18374 LP06093 2008-09-28 1
18647 LR01081 2008-09-30 1
18648 LR01082 2008-09-29 1
18649 LR01083 2008-09-28 1
18618 ls05031 2008-09-30 1
18619 ls05032 2008-09-29 1
18620 ls05033 2008-09-28 1
18476 LS10231 2008-09-30 1
18477 LS10232 2008-09-29 1
18478 LS10233 2008-09-28 1
19002 ma08051 2008-09-30 1
19049 ma08052 2008-09-29 1
19011 ma08053 2008-09-28 1
28315 MC12281 2008-09-30 1
28316 MC12282 2008-09-29 1
28317 MC12283 2008-09-28 1
18785 ME08161 2008-09-30 1
18786 ME08162 2008-09-29 1
18789 ME08163 2008-09-28 1
21909 MG09031 2012-12-12 1
19089 MG12281 2008-09-30 1
19090 MG12282 2008-09-29 1
19091 MG12283 2008-09-28 1
16852 MH02261 2008-09-30 1
16858 MH02262 2008-09-29 1
16859 MH02263 2008-09-28 1
17591 MH06142 2008-09-29 1
17597 MH06143 2008-09-28 1
18450 MJ06091 2008-09-30 1
18451 MJ06092 2008-09-29 1
18452 MJ06093 2008-09-28 1
18868 MJ09251 2008-09-30 1
18895 MJ09252 2008-09-29 1
18896 MJ09253 2008-09-28 1
19101 ML04041 2008-09-30 1
16898 ML05021 2008-09-30 1
16903 ML05022 2008-09-29 1
16900 ML05023 2008-09-28 1
16893 ml12221 2008-09-30 1
16991 ml12222 2008-09-29 1
16992 ml12223 2008-09-28 1
18674 MM08081 2008-09-30 1
18676 MM08082 2008-09-29 1
18679 MM08083 2008-09-28 1
20305 MR08101 2008-09-30 1
20307 MR08102 2008-09-29 1
20308 MR08103 2008-09-28 1
18719 MW07101 2008-09-30 1
18720 MW07102 2008-09-29 1
18721 MW07103 2008-09-28 1
19547 MWLMCExp 2011-09-14 1
19548 MWLWCRef 2011-09-11 1
18456 NB10251 2008-09-30 1
18457 NB10252 2008-09-29 1
18458 NB10253 2008-09-28 1
18468 NG04251 2008-09-30 1
18469 NG04252 2008-09-29 1
18470 NG04253 2008-09-28 1
18461 NM10231 2008-09-30 1
18463 NM10232 2008-09-29 1
18464 NM10233 2008-09-28 1
19079 NP03311 2008-09-30 1
19080 NP03312 2008-09-29 1
19083 NP03313 2008-09-28 1
18781 NY01031 2008-09-30 1
18850 NY01032 2008-09-29 1
18851 NY01033 2008-09-28 1
18783 PC09211 2008-09-30 1
18835 PC09212 2008-09-29 1
18842 PC09213 2008-09-28 1
18994 PD03181 2008-09-30 1
19001 PD03182 2008-09-29 1
19004 PD03183 2008-09-28 1
18836 PE05051 2008-09-30 1
18837 PE05052 2008-09-29 1
18838 PE05053 2008-09-28 1
18516 PJ05151 2008-09-30 1
18538 PJ05152 2008-09-29 1
18541 PJ05153 2008-09-28 1
19071 PM02041 2008-09-30 1
19076 PM02042 2008-09-29 1
19093 PM02043 2008-09-28 1
16839 ps11141 2008-09-30 1
16840 ps11142 2008-09-29 1
16844 ps11143 2008-09-28 1
17471 PV02041 2008-09-30 1
17475 PV02042 2008-09-29 1
17478 PV02043 2008-09-28 1
16841 RB03091 2008-09-30 1
16843 RB03092 2008-09-29 1
16845 RB03093 2008-09-28 1
17479 RC06231 2008-09-30 1
17481 RC06232 2008-09-29 1
17482 RC06233 2008-09-28 1
16860 RG09061 2008-09-30 1
16861 RG09062 2008-09-29 1
16862 RG09063 2008-09-28 1
18722 RK06241 2008-09-30 1
18725 RK06242 2008-09-29 1
18726 RK06243 2008-09-28 1
17571 RR06231 2008-09-30 1
17572 RR06232 2008-09-29 1
17574 RR06233 2008-09-28 1
21967 RR10111 2008-09-30 1
21973 RR10112 2008-09-29 1
21975 RR10113 2008-09-28 1
19064 SAD01171 2008-09-30 1
19067 SAD01172 2008-09-29 1
19092 SAD01173 2008-09-28 1
17126 sb03291 2008-09-30 1
17132 sb03292 2008-09-29 1
17133 sb03293 2008-09-28 1
18937 SG11141 2008-09-30 1
18938 SG11142 2008-09-29 1
18939 SG11143 2008-09-28 1
18807 Site2 2011-01-01 1
18361 SJ10311 2008-09-30 1
18362 SJ10312 2008-09-29 1
18363 SJ10313 2008-09-28 1
19068 SM03261 2011-09-30 1
19074 SM03262 2008-09-29 1
19085 SM03263 2008-09-28 1
16927 SNE06041 2008-09-30 1
16928 SNE06042 2008-09-29 1
16929 SNE06043 2008-09-28 1
16836 SP12241 2008-09-30 1
16837 SP12242 2008-09-29 1
16838 SP12243 2008-09-28 1
18792 SR07151 2008-09-30 1
18793 SR07152 2008-09-29 1
18795 SR07153 2008-09-28 1
16924 SS05301 2008-09-30 1
16925 SS05302 2008-09-29 1
16926 SS05303 2008-09-28 1
17390 SS11171 2008-09-30 1
17393 SS11172 2008-09-29 1
17394 SS11173 2008-09-28 1
16905 TD10171 2008-09-30 1
16915 TD10172 2008-09-29 1
16916 TD10173 2008-09-28 1
18365 TH10061 2008-09-28 1
18366 TH10062 2008-09-29 1
18367 TH10063 2008-09-28 1
18303 TL04171 2008-09-30 1
18305 TL04172 2008-09-29 1
18306 TL04173 2008-09-28 1
26032 TP102801 2008-09-30 1
26033 TP102802 2008-09-29 1
26036 TP102803 2008-09-28 1
18737 VA03271 2008-09-30 1
18740 VA03272 2008-09-29 1
18741 VA03273 2008-09-28 1
21950 VE03051 2008-09-30 1
21963 VE03052 2008-09-29 1
21977 VE03053 2008-09-28 1
18756 ZD03171 2008-09-30 1
18761 ZD03172 2008-09-29 1
18762 ZD03173 2008-09-28 1
21710 bh12261 2008-09-30 1
26231 BY09291 2008-09-30 1
16828 CC05191 2008-09-30 1
19104 CLD01 2008-09-30 1
19103 FRS01 2008-09-29 1
16997 GL09301 2008-09-30 1
26432 MG09032 2012-12-09 1
17289 MH06141 2008-09-30 1
18604 Muskwa 406 2011-08-05 1
18605 Muskwa 423 2011-08-05 1
18606 Muskwa 424 2011-08-05 1
18607 Muskwa 425 2011-08-05 1
18602 Muskwa1 2011-08-04 1
19102 QNS-01 2008-09-28 1

Liste des variables :

Ameletidae, Ametropodidae, Aturidae, Baetidae, Baetiscidae, Brachycentridae, Capniidae, Ceratopogonidae, Chironomidae, Chloroperlidae, Edwardsiidae, Elmidae, Empididae, Enchytraeidae, Ephemerellidae, Ephemeridae, Feltriidae, Glossosomatidae, Heptageniidae, Hydrophilidae, Hydropsychidae, Hydroptilidae, Hydrozetidae, Hydryphantidae, Hygrobatidae, Lebertiidae, Lepidostomatidae, Leptoceridae, Leptohyphidae, Leptophlebiidae, Limnephilidae, Lumbriculidae, Naididae, Nemouridae, Oreoleptidae, Peltoperlidae, Perlidae, Perlodidae, Phryganeidae, Pionidae, Planorbidae, Poduridae, Polycentropodidae, Psychodidae, Sialidae, Simuliidae, Sperchontidae, Taeniopterygidae, Tipulidae, Torrenticolidae, Valvatidae

ACTION: *Vérifiez les variables ci-haut et assurez-vous qu’elles sont toutes présentes.

1.3 Statistiques générales

Le tableau suivant présente les principaux paramètre généraux par variable. Lorsque le résultat obtenu à la ligne BinaryData du tableau est TRUE, cela indique que la variable présente des données binaires. Cependant, ce résultat peut également n’être obtenu que parce que la variable ne présente qu’une à deux données au maximum. La ligne Na.values indique le nombre de valeurs manquantes que présente chaque variable.

Tableau des statistiques générales

ACTION: Examinez les points suivants :

    • Vérifiez les données et assurez-vous qu’elles réflètent bien la réalité. Examinez les statistiques de base et identifiez, le cas échéant, des anomalies au niveaux des statistiques de base.

1.4 Répartition géographique

1.4.1 Répartition des taxons

Les graphiques suivants illustrent la position (latitude et longitude) ainsi que l’abondance en taxons des sites observées dans le fichier de données pour chaque taxon.

ACTION: Examinez les éléments suivants :

  • La distribution géographique des taxons présentent-elles des anomalies?
  • Des données sortent-elles de l’ordinaire?

1.4.2 Répartition de la richesse

Les graphiques suivants illustrent la position (latitude et longitude) ainsi que la richesse en taxons par site observées dans le fichier de données.

ACTION: Examinez les points suivants :

  • La position géographique des mesures est-elle juste?
  • Des mesures de richesse sortent-elles de l’ordinaire?
  • Un patron de distribution de la richesse est-il apparent?

La carte interactive suivante illustre les mêmes données que le graphique précédent. Cliquez sur le marqueur d’une visite pour indiquer la richesse en taxons observée dans celle-ci.

1.5 Présence de données aberrantes

1.5.1 Diagrammes de dispersion des valeurs observées

Les diagrammes de dispersion suivants présentent la valeur des abondances des taxons dans l’ordre à laquelle elles apparaissent dans ce fichier. Sous l’axe des X se trouve l’identifiant de la visite vis-à-vis la valeur observée correspondante, soit le nom du site d’où provient la donnée, sa date d’échantillonnage et le nombre d’échantillonnage pris pour cette donnée.

ACTION: Examinez les points suivants :

  • La distribution des valeurs d’abondance indique-t’elle un phénomène écologique ou un problème potentiel?
  • Des taxons sont-ils très rares ou au contraire très fréquents?
  • Un problème avec les données d’abondance est-il apparent?

1.5.2 Boîtes à moustaches de l’abondance par taxon observée et transformée

Pour chaque variable, la première boîte à moustaches (à gauche) illustre la distribution des abondances observées dans le fichier de données et la deuxième boîte à moustaches (à droite) illustre la distribution des abondances observées dans le fichier de données ayant subies une transformation logarithmique.

ACTION: Examinez les points suivants :

  • La position géographique des mesures est-elle juste?
  • Des mesures de richesse sortent-elles de l’ordinaire?
  • Un patron de distribution de la richesse est-il apparent?
  • La transformation des données améliore-t’elle la distribution des abondances?

1.5.3 Identification des données aberrantes potentielles

Pour chaque variable, la première boîte à moustaches (à gauche) illustre la distribution des valeurs de variables continues observées dans le fichier de données. Le second graphique est le graphe de Cleveland qui donne plus de détails sur la distribution des valeurs observées. Les valeurs d’abondance sont présentées dans l’ordre d’apparition dans le fichier de données.

Les données présentant une identification par leur identifiant sur les diagrammes représentent les données potentiellement aberrantes contenues dans le fichier de données. L’identifiant de la visite correspond au nom du site d’où provient la donnée, sa date d’échantillonnage et le nombre d’échantillonnage pris pour cette donnée.

L’interprétation du graphe de Cleveland se fait par l’examen des points qui se trouvent aux extrémités gauche ou droite du graphique. Ces points montrent des abondances largement différentes par rapport à la majorité des observations et requierent un examen plus approfondi. Si vous concluez que ces valeurs extrèmes sont des erreurs de mesure, elles devraient être supprimées du fichier de données car elles domineront l’analyse de données. Si l’omission de ces abondances n’est pas une option, une transformation des données devrait être envisagée.

ACTION: Examinez les points suivants :

  • Les points aux extrémités des boites à moustache vous semblent-ils représenter des données aberrantes?
  • Ces mêmes points se sont-ils isolés (à gauche ou à droite) sur le graphe de Cleveland?

La liste suivante présente les données potentiellement aberrantes contenues dans le fichier de données pour chaque variable. Lorsque l’identifiant d’une donnée y est indiqué, cela indique que cette donnée représente une donnée potentiellement aberrante contenue dans le fichier de données. Les mentions “” indiquent les données non aberrantes et les mentions NA indiquent la présence de valeurs manquantes. L’identifiant de la visite correspond au nom du site d’où provient la donnée, sa date d’échantillonnage et le nombre d’échantillonnage pris pour cette donnée.

1.6 Présence de zéros

1.6.1 Histogramme de fréquences d’abondances

L’histogramme suivant illustre la distribution des fréquences d’abondances par taxon du fichier de données. Ce graphique permet notamment d’évaluer la quantité de valeurs d’abondances équivalentes à 0 à travers tous les taxons du fichier de données.

1.6.2 Matrice de corrélation des doubles zéros

La matrice de corrélation suivante illustre la force de corrélation qui existe entre deux taxons présentant des valeurs d’abondances équivalentes à 0 par l’intensité de la couleur. Une corrélation illustrée par la couleur blanche indique une force de corrélation qui tend vers une valeur de 0.5 et une corrélation illustrée par la couleur bleue foncée indique une force de corrélation qui tend vers une valeur de 1. Cette matrice illustre également la proportion de valeurs d’abondances à 0 que présente un taxon par rapport à toutes les valeurs d’abondances observées dans ce dernier. Seulement les taxons présents dans plus de 25% des visites y sont représentés.

1.7 Normalité des données

1.7.1 Diagrammes Quantile-Quantile et histogrammes de fréquences

Pour chaque variable, le premier graphique (à gauche) illustre la distribution observée des valeurs par taxon par des points et la distribution normale théorique calculée à partir des paramètres de la distribution observée par une droite. Plus les valeurs observées sont positionnées sur la droite, plus celles-ci sont distribuées selon la loi normale. Le deuxième graphique (à droite) illustre par un histogramme la distribution des fréquences des valeurs observées par taxon. Il permet notamment de vérifier et valider si la distribution des données semble suivre la loi normale. Cet histogramme illustre également l’abondance moyenne par taxon par une ligne pleine ainsi que l’écart-type des abondances par taxon par deux lignes pointillées.

1.7.2 Normalité des données

1.7.2.1 Tests de normalité par taxon

Les résultats suivants présentent le résultat obtenu par un test de Snows appliqué sur chaque variable du fichier de données. Une valeur de P (p-value) inférieure à 0.05 indique qu’il n’est pas possible de supposer que la distribution des données suit la loi normale avec une probabilité de 95%.

$Ameletidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Ametropodidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Aturidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Baetidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Baetiscidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Brachycentridae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Capniidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Ceratopogonidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Chironomidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Chloroperlidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Edwardsiidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Elmidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Empididae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Enchytraeidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Ephemerellidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Ephemeridae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Feltriidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Glossosomatidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Heptageniidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Hydrophilidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Hydropsychidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Hydroptilidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Hydrozetidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Hydryphantidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Hygrobatidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Lebertiidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Lepidostomatidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Leptoceridae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Leptohyphidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Leptophlebiidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Limnephilidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Lumbriculidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Naididae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Nemouridae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Oreoleptidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Peltoperlidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Perlidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Perlodidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Phryganeidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Pionidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Planorbidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Poduridae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Polycentropodidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Psychodidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Sialidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Simuliidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Sperchontidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Taeniopterygidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Tipulidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Torrenticolidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)


$Valvatidae

    Snow's Penultimate Normality Test

data:  newX[, i]
p-value < 2.2e-16
alternative hypothesis: 
    The data does not come from a strict normal distribution (but may
    represent a distribution that is close enough)

1.7.2.2 Occurence en taxons

Dans combien de sites chaque taxon est-il présent?

La liste qui suit montre en ordre croissant l’occurence des taxons dans le jeu de données.

Par la suite, deux graphiques sont proposés. Le premier graphique (à gauche) illustre la distribution des fréquences des valeurs d’occurrence en taxons. Le deuxième graphique (à droite) montre la distribution des fréquences des valeurs calculées d’occurrence en taxons à partir du fichier de données ayant subies une transformation logarithmique. Cet histogramme illustre également l’occurrence moyenne par taxon par une ligne pleine ainsi que l’écart-type des occurrences par taxon par deux lignes pointillées.

Un examen de ces deux graphiques permet notamment de vérifier si la distribution des données semble suivre la loi normale. Si la distribution des données sur le deuxième graphique semble ressembler davantage à une distribution normale, une transformation logarithmique des données pourrait être nécessaire.

       Ameletidae     Ametropodidae          Aturidae          Baetidae 
              147                 1               146               443 
      Baetiscidae   Brachycentridae         Capniidae   Ceratopogonidae 
                1               148                 2                 3 
     Chironomidae    Chloroperlidae      Edwardsiidae           Elmidae 
              444               150                 1                 1 
        Empididae     Enchytraeidae    Ephemerellidae       Ephemeridae 
              288                 1               294                 3 
       Feltriidae   Glossosomatidae     Heptageniidae     Hydrophilidae 
                1               294               440                 1 
   Hydropsychidae     Hydroptilidae      Hydrozetidae    Hydryphantidae 
              439               146                 1               144 
     Hygrobatidae       Lebertiidae  Lepidostomatidae      Leptoceridae 
                1               146               293                 1 
    Leptohyphidae   Leptophlebiidae     Limnephilidae     Lumbriculidae 
              146               293                 2                 2 
         Naididae        Nemouridae      Oreoleptidae     Peltoperlidae 
              443               149                 4                 3 
         Perlidae        Perlodidae      Phryganeidae          Pionidae 
                1               145                 1               145 
      Planorbidae         Poduridae Polycentropodidae       Psychodidae 
                1                 2               145               145 
         Sialidae        Simuliidae     Sperchontidae  Taeniopterygidae 
                1               148               147                 1 
        Tipulidae   Torrenticolidae        Valvatidae 
              293               145                 1 
[1] "Ordre croissant des occurrences en taxons"
    Ametropodidae       Baetiscidae      Edwardsiidae           Elmidae 
                1                 1                 1                 1 
    Enchytraeidae        Feltriidae     Hydrophilidae      Hydrozetidae 
                1                 1                 1                 1 
     Hygrobatidae      Leptoceridae          Perlidae      Phryganeidae 
                1                 1                 1                 1 
      Planorbidae          Sialidae  Taeniopterygidae        Valvatidae 
                1                 1                 1                 1 
        Capniidae     Limnephilidae     Lumbriculidae         Poduridae 
                2                 2                 2                 2 
  Ceratopogonidae       Ephemeridae     Peltoperlidae      Oreoleptidae 
                3                 3                 3                 4 
   Hydryphantidae        Perlodidae          Pionidae Polycentropodidae 
              144               145               145               145 
      Psychodidae   Torrenticolidae          Aturidae     Hydroptilidae 
              145               145               146               146 
      Lebertiidae     Leptohyphidae        Ameletidae     Sperchontidae 
              146               146               147               147 
  Brachycentridae        Simuliidae        Nemouridae    Chloroperlidae 
              148               148               149               150 
        Empididae  Lepidostomatidae   Leptophlebiidae         Tipulidae 
              288               293               293               293 
   Ephemerellidae   Glossosomatidae    Hydropsychidae     Heptageniidae 
              294               294               439               440 
         Baetidae          Naididae      Chironomidae 
              443               443               444 

Les graphiques suivants sont similaires aux précédents mais pour les fréquences relatives.

       Ameletidae     Ametropodidae          Aturidae          Baetidae 
       32.8125000         0.2232143        32.5892857        98.8839286 
      Baetiscidae   Brachycentridae         Capniidae   Ceratopogonidae 
        0.2232143        33.0357143         0.4464286         0.6696429 
     Chironomidae    Chloroperlidae      Edwardsiidae           Elmidae 
       99.1071429        33.4821429         0.2232143         0.2232143 
        Empididae     Enchytraeidae    Ephemerellidae       Ephemeridae 
       64.2857143         0.2232143        65.6250000         0.6696429 
       Feltriidae   Glossosomatidae     Heptageniidae     Hydrophilidae 
        0.2232143        65.6250000        98.2142857         0.2232143 
   Hydropsychidae     Hydroptilidae      Hydrozetidae    Hydryphantidae 
       97.9910714        32.5892857         0.2232143        32.1428571 
     Hygrobatidae       Lebertiidae  Lepidostomatidae      Leptoceridae 
        0.2232143        32.5892857        65.4017857         0.2232143 
    Leptohyphidae   Leptophlebiidae     Limnephilidae     Lumbriculidae 
       32.5892857        65.4017857         0.4464286         0.4464286 
         Naididae        Nemouridae      Oreoleptidae     Peltoperlidae 
       98.8839286        33.2589286         0.8928571         0.6696429 
         Perlidae        Perlodidae      Phryganeidae          Pionidae 
        0.2232143        32.3660714         0.2232143        32.3660714 
      Planorbidae         Poduridae Polycentropodidae       Psychodidae 
        0.2232143         0.4464286        32.3660714        32.3660714 
         Sialidae        Simuliidae     Sperchontidae  Taeniopterygidae 
        0.2232143        33.0357143        32.8125000         0.2232143 
        Tipulidae   Torrenticolidae        Valvatidae 
       65.4017857        32.3660714         0.2232143 
[1] "Ordre croissant des fréquences relatives en taxons"
    Ametropodidae       Baetiscidae      Edwardsiidae           Elmidae 
              0.2               0.2               0.2               0.2 
    Enchytraeidae        Feltriidae     Hydrophilidae      Hydrozetidae 
              0.2               0.2               0.2               0.2 
     Hygrobatidae      Leptoceridae          Perlidae      Phryganeidae 
              0.2               0.2               0.2               0.2 
      Planorbidae          Sialidae  Taeniopterygidae        Valvatidae 
              0.2               0.2               0.2               0.2 
        Capniidae     Limnephilidae     Lumbriculidae         Poduridae 
              0.4               0.4               0.4               0.4 
  Ceratopogonidae       Ephemeridae     Peltoperlidae      Oreoleptidae 
              0.7               0.7               0.7               0.9 
   Hydryphantidae        Perlodidae          Pionidae Polycentropodidae 
             32.1              32.4              32.4              32.4 
      Psychodidae   Torrenticolidae          Aturidae     Hydroptilidae 
             32.4              32.4              32.6              32.6 
      Lebertiidae     Leptohyphidae        Ameletidae     Sperchontidae 
             32.6              32.6              32.8              32.8 
  Brachycentridae        Simuliidae        Nemouridae    Chloroperlidae 
             33.0              33.0              33.3              33.5 
        Empididae  Lepidostomatidae   Leptophlebiidae         Tipulidae 
             64.3              65.4              65.4              65.4 
   Ephemerellidae   Glossosomatidae    Hydropsychidae     Heptageniidae 
             65.6              65.6              98.0              98.2 
         Baetidae          Naididae      Chironomidae 
             98.9              98.9              99.1 

1.7.2.3 Boîtes à moustaches d’occurrences en taxons

La première boîte à moustaches (à gauche) illustre la distribution des occurrences calculées à partir du fichier de données et la deuxième boîte à moustaches (à droite) illustre la distribution des occurrences calculées à partir du fichier de données ayant subies une transformation logarithmique.

Les graphiques suivants sont similaires aux précédents mais pour les fréquences relatives

1.8 Indépendance des taxons

1.8.1 Matrice de corrélation entre les taxons

La matrice de corrélation suivante illustre la relation qui existe entre deux taxons par la présence d’une courbe. Elle permet notamment de vérifier et valider la présence de corrélation entre des taxons. Seulement les taxons présents dans plus de 25% des visites y sont représentés.

[1] "PlotMatrix: done"

1.8.2 Matrice de corrélation de Pearson globale

La matrice de corrélation suivante illustre la force de corrélation qui existe entre deux taxons par l’intensité de la couleur. Une corrélation illustrée par la couleur blanche indique une force de corrélation qui tend vers une valeur de 0 et une corrélation illustrée par la couleur bleue foncée indique une force de corrélation qui tend vers une valeur de 1. Les valeurs de corrélation de Pearson entre les taxons y sont indiquées dans la portion inférieure gauche de la figure. Cette matrice illustre également la proportion de valeurs d’abondances non égales à 0 que présente un taxon par rapport à toutes les valeurs d’abondances observées dans ce dernier. Seulement les taxons présents dans plus de 25% des visites y sont représentés.

1.8.3 Abondance des taxons dans le temps

Il peut être intéressant d’examiner l’évalution de l’abondance des taxons dans le temps afin d’observer des dynamiques ou des changements abrutes.

Pour chaque taxon, le premier graphique (en haut à gauche) illustre la valeur d’abondance des données selon leur année d’échantillonnage. Le deuxième graphique (en haut à droite) illustre les tendances observées de variations des abondances en individus dans le temps. Le troisième graphique (en bas à gauche) illustre les prévisions futures de variations des abondances en individus dans le temps. Sur ce graphique la ligne bleue correspond à la tendance attendue moyenne de variations dans le temps, la zone grise foncée correspond à un intervalle de confiance de 80% et la zone grise pâle correspond à un intervalle de confiance de 95%. Le quatrième graphique (en bas à droite) illustre l’autocorrélation de séries temporelles (ACF). Une valeur d’autocorrélation supérieure à l’intervalle de confiance de 95% illustrée par la ligne pointillée indique une possible dépendance entre la variable et la période de l’année (temps). Par exemple, une certaine valeur d’abondance d’un taxon observée lors d’une année précise pourrait être expliquée par un certain événement datant d’une année antérieure (décalage dans le temps en années). Il est à noter que l’autocorrélation au temps de décalage 0 est, par définition, égale à 1.

Les résultats suivants présentent le calcul du test de la statistique de Box-Ljung appliqué sur chaque taxon et sont complémentaires aux résultats illustrés par les graphiques précédents. Une valeur de P (p-value) inférieure à 0.05 indique que les valeurs résiduelles d’une variable dépendent de la période de l’année (temps).

1.8.4 Corrélation spatiale des taxons

Les résultats suivants présentent les résultats d’autocorrélation spatiale appliquée sur chaque variable. Une valeur de P (p-value) inférieure à 0.05 permet de supposer que la distribution spatiale des valeurs font l’objet d’une agrégation spatiale non aléatoire. Lorsque la valeur de P (p-value) est inférieure à 0.05, un indice de Moran (I de Moran I) positif indique que les valeurs sont aggrégés entre elles tandis qu’un indice de Moran négatif indique que les valeurs sont dispersées entre elles.

1.9 Diversité

1.9.1 Tableau des indices de diversité en taxons

Le tableau suivant présente le calcul de plusieurs indices de diversité en taxons calculés pour chaque visite.

1.9.2 Histogrammes de l’occurrence de la diversité

1.10 Notes sur les versions

Quoi de nouveau, mis à jour ou corrigé dans cette version


ACTION: Nouveau     ACTION: Mise à jour     ACTION: Corrigé


RCBA_vv_biologique.Rmd Version 1.1 — 14 février 2017

ACTION: Mise à jour — Réduire le nombre de procédures et modifier leur organisation.

RCBA_vv_biologique.Rmd Version 1.0 — 18 août 2017

ACTION: Première version.


Développé par Martin Jean et Evelyne Paquette-Boisclair

LS0tDQpkYXRlOiAnMjAxNy0xMS0wMicNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQp2ZXJzaW9uOiAnMS4xJw0KLS0tDQoNCnwgIVtdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vZ2NfZnIucG5nKSAgfCAgIVtdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vcmNiYV9sb2dvLnBuZykgfA0KfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06fCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQojVsOJUklGSUNBVElPTiBFVCBWQUxJREFUSU9OIFJDQkEgLSBET05Ow4lFUyBEJ0hBQklUQVQNCg0KKkVudmlyb25uZW1lbnQgZXQgY2hhbmdlbWVudCBjbGltYXRpcXVlIENhbmFkYSoNCg0KKkFuYWx5c2UgcsOpYWxpc8OpZSBsZSBgciBTeXMudGltZSgpYCoNCg0KKioqDQoNCkNlIGRvY3VtZW50IGVzdCB1biBjYXJuZXQgZGUgbm90ZSDDqWNyaXQgZW4gW01hcmtkb3duIFJdKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pLiBMb3JzcXVlIHZvdXMgw6l4w6ljdXRlciBsZSBjb2RlIGludMOpZ3LDqSBhdSBjYXJuZXQsIGxlcyByw6lzdWxhdHMgYXBwYXJhaXRyb250IHNvdXMgbGUgY29kZSBjb3JyZXNwb25kYW50Lg0KDQpDZSByYXBwb3J0IHByw6lzZW50ZSBsZXMgcsOpc3VsdGF0cyBkZSBsYSB2w6lyaWZpY2F0aW9uIGV0IGxhIHZhbGlkYXRpb24gZGVzIGRvbm7DqWVzIGJpb2xvZ2lxdWVzIHBvdXIgbGUgcHJvamV0ICoqYHIgcGFzdGUoZGF0YXNldE5hbWUpYCoqLg0KDQpEYW5zIGNldHRlIGFuYWx5c2UsIGxlIGpldSBkZSBkZXNjcmlwdGV1cnMgYmlvbG9naXF1ZXMgc2VyYSB2w6lyaWZpw6kgcG91ciByw6lwb25kcmUgw6AgbGEgcXVlc3Rpb24gc3VpdmFudGUgOg0KICANCiAgKyBMZXMgZG9ubsOpZXMgYmlvbG9naXF1ZXMgY29ycmVzcG9uZGVudC1lbGxlcyBiaWVuIMOgIGNlIHF1aSBhIMOpdMOpIG9ic2VydsOpIHN1ciBsZSB0ZXJyYWluID8NCg0KQ2UgZG9jdW1lbnQgZXN0IHVuIGNhcm5ldCBkZSBub3RlcyBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkuIFBvdXIgb2J0ZW5pciBsZXMgcsOpc3VsdGF0cyBkZSBsYSB2w6lyaWZpY2F0aW9uIGV0IGxhIHZhbGlkYXRpb24gZGVzIGRvbm7DqWVzLCBleMOpY3V0ZXogbGVzIGNvbW1hbmRlcyBjb250ZW51ZXMgZGFucyBjZSBjYXJuZXQgZGUgbm90ZXMuIFBvdXIgY2UgZmFpcmUsIHBvc2l0aW9ubmV6IHZvdHJlIGN1cnNldXIgw6AgbCdpbnTDqXJpZXVyIGQndW5lIGJvw650ZSBkZSBjb21tYW5kZXMgZXQgY2xpcXVleiBzdXIgbGEgZmzDqGNoZSB2ZXJ0ZSDDoCBsYSBkcm9pdGUgZGUgY2VsbGUtY2kgbm9tbcOpZSAqUnVuIEN1cnJlbnQgQ2h1bmsqIG91IGFwcHV5ZXogc3VyIGxlcyB0b3VjaGVzICpDdHJsK01haitFbnRyw6llKiAoKkNtZC1NYWorRW50csOpZSogc3VyICptYWNPUyopIGRlIHZvdHJlIGNsYXZpZXIuIFLDqXDDqXRleiBwb3VyIGNoYXF1ZSBib8OudGUgZGUgY29tbWFuZGVzLiDDgCBtZXN1cmUgcXVlIGxlcyBjb21tYW5kZXMgY29udGVudWVzIGRhbnMgY2UgY2FybmV0IHNlcm9udCBleMOpY3V0w6llcywgbGVzIHLDqXN1bHRhdHMgYXBwYXJhw650cm9udCBzb3VzIGNoYWN1bmUgZGVzIGNvbW1hbmRlcyBjb3JyZXNwb25kYW50ZXMgZGFucyBsYSBwcsOpc2VudGUgZmVuw6p0cmUuIFVuZSBmb2lzIHRvdXRlcyBsZXMgY29tbWFuZGVzIGV4w6ljdXTDqWVzLCBjbGlxdWV6IHN1ciBsZSBib3V0b24gKlByZXZpZXcqIGVuIGhhdXQgw6AgZ2F1Y2hlIGRlIGxhIHByw6lzZW50ZSBmZW7DqnRyZSBvdSBhcHB1eWVyIHN1ciBsZXMgdG91Y2hlcyAqQ3RybCtNYWorSyouIFVuZSBub3V2ZWxsZSBmZW7DqnRyZSBhcHBhcmHDrnRyYSBldCBjb250aWVuZHJhIGxlIHJhcHBvcnQgZGUgY2VzIHLDqXN1bHRhdHMgZGUgbGEgdsOpcmlmaWNhdGlvbiBldCBsYSB2YWxpZGF0aW9uIGRlcyBkb25uw6llcyBnw6luw6lyYWxlcyBSQ0JBLg0KDQojI1Byw6lyZXF1aXMNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIE1vZHVsZXMgZXh0ZXJuZXMgZXQgZm9uY3Rpb25zIHBlcnNvbm5hbGlzw6llcyByZXF1aXMNCnNvdXJjZSgiLi4vLi4vLi4vUmVxdWlyZWRfcGFja2FnZXMuUiIpDQpzb3VyY2UoIi4uLy4uLy4uL1JlcXVpcmVkX2Z1bmN0aW9ucy5SIikNCg0KDQojIyBQcm9qZWN0IFByZWZlcmVuY2VzDQpzb3VyY2UoIi4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vcHJvamVjdF9zZXR0aW5ncy5SIikNCg0KYGBgDQoNCiMjU3RhdGlzdGlxdWVzIGRlc2NyaXB0aXZlcw0KDQpMZSBmaWNoaWVyIGRlIGRvbm7DqWVzIGNvbnRpZW50IGByIG5yb3coZGF0YXNldC5CSU8pYCB2aXNpdGVzIChsaWduZXMpIGV0IGByIG5jb2woZGF0YXNldC5CSU8pYCB0YXhvbnMgKGNvbG9ubmVzKS4NCg0KTGUgdGFibGVhdSBzdWl2YW50IHByw6lzZW50ZSB1bmUgcGFydGllIGRlcyBkb25uw6llcyBkdSBmaWNoaWVyLg0KDQoqKkxlY3R1cmUgZGVzIGRvbm7DqWVzIGJpb2xvZ2lxdWVzKioNCg0KYHIgaGVhZChkYXRhc2V0LkJJTykgYA0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqRXhhbWluZXogbGVzIHBvaW50cyBzdWl2YW50cyA6Kg0KPiANCj4NCj4gLSAqTGUgZmljaGllciBzZW1ibGUtdCdpbCBhdm9pciDDqXTDqSBsdSBjb3JyZWN0ZW1lbnQ/Kg0KPiAtICpEZXMgY29sb25uZXMgc29udC1lbGxlcyBtYW5xdWFudGVzPyoNCg0KKipMaXN0ZSBkZXMgdmlzaXRlcyBwcsOpc2VudGVzIGRhbnMgbGVzIGRvbm7DqWVzIGJpb2xvZ2lxdWVzIChJRCBwcm92ZW5hbnQgZGUgbGEgYmFzZSBkZSBkb25uw6llcyBSQ0JBKSA6KiogIA0KDQpgciByb3duYW1lcyhkYXRhc2V0LkJJTykgYA0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqRXhhbWluZXogbGVzIHBvaW50cyBzdWl2YW50cyA6Kg0KPiANCj4gLSAqTGEgbGlzdGUgY2ktaGF1dCBjb3JyZXNwb25kLXQnZWxsZSBhdmVjIGxlIHRhYmxlYXUgc3VpdmFudCBxdWkgcHLDqXNlbnRlIGxlcyB2aXNpdGVzIHByw6lzZW50ZXMgZGFucyBsJ3VuIG91IGwnYXV0cmUgZGVzIGZpY2hpZXJzIGRlIGRvbm7DqWVzIGR1IHByb2pldCBgciBwYXN0ZShkYXRhc2V0TmFtZSlgPyoNCg0KDQoNCmByIGZvcm1hdHRhYmxlKGRhdGFzZXQuTkFNLCBhbGlnbiA9ICJjIiwgcm93Lm5hbWVzID0gVFJVRSlgDQoNCioqTGlzdGUgZGVzIHZhcmlhYmxlcyA6KiogIA0KDQpgciBjb2xuYW1lcyhkYXRhc2V0LkJJTykgYA0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqVsOpcmlmaWV6IGxlcyB2YXJpYWJsZXMgY2ktaGF1dCBldCBhc3N1cmV6LXZvdXMgcXUnZWxsZXMgc29udCB0b3V0ZXMgcHLDqXNlbnRlcy4NCg0KDQojI1N0YXRpc3RpcXVlcyBnw6luw6lyYWxlcw0KDQpMZSB0YWJsZWF1IHN1aXZhbnQgcHLDqXNlbnRlIGxlcyBwcmluY2lwYXV4IHBhcmFtw6h0cmUgZ8OpbsOpcmF1eCBwYXIgdmFyaWFibGUuIExvcnNxdWUgbGUgcsOpc3VsdGF0IG9idGVudSDDoCBsYSBsaWduZSAqQmluYXJ5RGF0YSogZHUgdGFibGVhdSBlc3QgKlRSVUUqLCBjZWxhIGluZGlxdWUgcXVlIGxhIHZhcmlhYmxlIHByw6lzZW50ZSBkZXMgZG9ubsOpZXMgYmluYWlyZXMuIENlcGVuZGFudCwgY2UgcsOpc3VsdGF0IHBldXQgw6lnYWxlbWVudCBuJ8OqdHJlIG9idGVudSBxdWUgcGFyY2UgcXVlIGxhIHZhcmlhYmxlIG5lIHByw6lzZW50ZSBxdSd1bmUgw6AgZGV1eCBkb25uw6llcyBhdSBtYXhpbXVtLiBMYSBsaWduZSAqTmEudmFsdWVzKiBpbmRpcXVlIGxlIG5vbWJyZSBkZSB2YWxldXJzIG1hbnF1YW50ZXMgcXVlIHByw6lzZW50ZSBjaGFxdWUgdmFyaWFibGUuDQoNCioqVGFibGVhdSBkZXMgc3RhdGlzdGlxdWVzIGfDqW7DqXJhbGVzKioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiNUYWJsZWF1IGRlcyBwYXJhbcOodHJlcyBnw6luw6lyYXV4IHBhciB2YXJpYWJsZQ0KDQp7c3VtbWFyeS5CSU8gPC0gYXMuZGF0YS5mcmFtZSh0KGRvLmNhbGwoY2JpbmQsIGxhcHBseShkYXRhc2V0LkJJTywgc3VtbWFyeSkpKSkNCnN1bW1hcnkuQklPJFN0ZC5kZXZpYXRpb24gPC0gYXBwbHkoZGF0YXNldC5CSU8sIDIsIHNkLCBuYS5ybSA9IFQpDQpzdW1tYXJ5LkJJTyRMZW5ndGggPC0gY29sU3VtcyghaXMubmEoZGF0YXNldC5CSU8pKQ0Kc3VtbWFyeS5CSU8kQmluYXJ5RGF0YSA8LSBzYXBwbHkoZGF0YXNldC5CSU8sZnVuY3Rpb24oeClsZW5ndGgodW5pcXVlKG5hLm9taXQoeCkpKTw9MikNCnN1bW1hcnkuQklPJE5BLnZhbHVlcyA8LSBjb2xTdW1zKGlzLm5hKGRhdGFzZXQuQklPKSkNCnN1bW1hcnkuQklPJGBOQSdzYCA8LSBOVUxMDQpzdW1tYXJ5LkJJTyA8LSBhcy5kYXRhLmZyYW1lKHQoc3VtbWFyeS5CSU8pKQ0Kc3VtbWFyeS5CSU8NCn0NCiNmb3JtYXR0YWJsZShzdW1tYXJ5LkJJTywgZGlnaXRzID0gMiwgYWxpZ24gPSAiYyIpDQoNCmBgYA0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqRXhhbWluZXogbGVzIHBvaW50cyBzdWl2YW50cyA6Kg0KPiANCj4gDQo+IC0gKiBWw6lyaWZpZXogbGVzIGRvbm7DqWVzIGV0IGFzc3VyZXotdm91cyBxdSdlbGxlcyByw6lmbMOodGVudCBiaWVuIGxhIHLDqWFsaXTDqS4gRXhhbWluZXogbGVzIHN0YXRpc3RpcXVlcyBkZSBiYXNlIGV0IGlkZW50aWZpZXosIGxlIGNhcyDDqWNow6lhbnQsIGRlcyBhbm9tYWxpZXMgYXUgbml2ZWF1eCBkZXMgc3RhdGlzdGlxdWVzIGRlIGJhc2UuDQoNCg0KIyNSw6lwYXJ0aXRpb24gZ8Opb2dyYXBoaXF1ZQ0KDQoNCiMjI1LDqXBhcnRpdGlvbiBkZXMgdGF4b25zDQoNCkxlcyBncmFwaGlxdWVzIHN1aXZhbnRzIGlsbHVzdHJlbnQgbGEgcG9zaXRpb24gKGxhdGl0dWRlIGV0IGxvbmdpdHVkZSkgYWluc2kgcXVlIGwnYWJvbmRhbmNlIGVuIHRheG9ucyBkZXMgc2l0ZXMgb2JzZXJ2w6llcyBkYW5zIGxlIGZpY2hpZXIgZGUgZG9ubsOpZXMgcG91ciBjaGFxdWUgdGF4b24uDQoNCj4gIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2FjdGlvbi5wbmcpDQo+ICpFeGFtaW5leiBsZXMgw6lsw6ltZW50cyBzdWl2YW50cyA6Kg0KPiANCj4gDQo+IC0gKkxhIGRpc3RyaWJ1dGlvbiBnw6lvZ3JhcGhpcXVlIGRlcyB0YXhvbnMgcHLDqXNlbnRlbnQtZWxsZXMgZGVzIGFub21hbGllcz8qDQo+IC0gKkRlcyBkb25uw6llcyBzb3J0ZW50LWVsbGVzIGRlIGwnb3JkaW5haXJlPyoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNEaXN0cmlidXRpb24gZ8Opb2dyYXBoaXF1ZSBkZXMgdGF4b24NCg0KZGF0YXNldC5HRU4yIDwtIHJvd25hbWVzX3RvX2NvbHVtbihkYXRhc2V0LkdFTiwgdmFyID0gInJvd25hbWVzIikNCmRhdGFzZXQuQklPMiA8LSByb3duYW1lc190b19jb2x1bW4oZGF0YXNldC5CSU8sIHZhciA9ICJyb3duYW1lcyIpDQpkYXRhc2V0LkJJTzIgPC0gbGVmdF9qb2luKGRhdGFzZXQuQklPMiwgZGF0YXNldC5HRU4yWyxjKCJyb3duYW1lcyIsICJMb25naXR1ZGUiLCAiTGF0aXR1ZGUiKV0sIGJ5ID0gInJvd25hbWVzIikNCg0Kc2l6ZSA8LSBkYXRhc2V0LkJJTzJbMjpuY29sKGRhdGFzZXQuQklPMildDQpzaXplW2MobGVuZ3RoKHNpemUpLTIsbGVuZ3RoKHNpemUpLTEsIGxlbmd0aChzaXplKSldIDwtIE5BDQoNCmZvcihpIGluIDI6KG5jb2woZGF0YXNldC5CSU8yKS0zKSl7DQpncmFwaC5nZW8uYWIgPC0gZ2dwbG90KGRhdGFzZXQuQklPMiwgYWVzKExvbmdpdHVkZSwgTGF0aXR1ZGUpKSArDQogIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgYWVzKHNpemUgPSBzaXplW2ktMV0pKSArDQogIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1dGlvbiBnw6lvZ3JhcGhpcXVlIGRlIiwgY29sbmFtZXMoZGF0YXNldC5CSU8yW2ldKSkpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMSwxMCksIG5hbWUgPSAiQWJvbmRhbmNlIikNCmdyYXBoLmdlby5hYg0KcHJpbnQoZ3JhcGguZ2VvLmFiKQ0KfQ0KDQpybShzaXplKQ0Kcm0oZGF0YXNldC5HRU4yKQ0KDQpgYGANCg0KDQojIyNSw6lwYXJ0aXRpb24gZGUgbGEgcmljaGVzc2UNCg0KTGVzIGdyYXBoaXF1ZXMgc3VpdmFudHMgaWxsdXN0cmVudCBsYSBwb3NpdGlvbiAobGF0aXR1ZGUgZXQgbG9uZ2l0dWRlKSBhaW5zaSBxdWUgbGEgcmljaGVzc2UgZW4gdGF4b25zIHBhciBzaXRlIG9ic2VydsOpZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzLg0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqRXhhbWluZXogbGVzIHBvaW50cyBzdWl2YW50cyA6Kg0KPiANCj4gDQo+IC0gKkxhIHBvc2l0aW9uIGfDqW9ncmFwaGlxdWUgZGVzIG1lc3VyZXMgZXN0LWVsbGUganVzdGU/Kg0KPiAtICpEZXMgbWVzdXJlcyBkZSByaWNoZXNzZSBzb3J0ZW50LWVsbGVzIGRlIGwnb3JkaW5haXJlPyoNCj4gLSAqVW4gcGF0cm9uIGRlIGRpc3RyaWJ1dGlvbiBkZSBsYSByaWNoZXNzZSBlc3QtaWwgYXBwYXJlbnQ/Kg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI0Rpc3RyaWJ1dGlvbiBnw6lvZ3JhcGhpcXVlIGRlIGxhIHJpY2hlc3NlIGVuIHRheG9ucw0KDQpkYXRhc2V0LkJJTzIkcmljaG5lc3MgPC0gYXBwbHkoZGF0YXNldC5CSU8gPiAwLCAxLCBzdW0sIG5hLnJtPVRSVUUpDQpkYXRhc2V0LlNQQTIgPC0gcm93bmFtZXNfdG9fY29sdW1uKGRhdGFzZXQuU1BBLCB2YXIgPSAicm93bmFtZXMiKQ0KZGF0YXNldC5TUEEyIDwtIGxlZnRfam9pbihkYXRhc2V0LlNQQTIsIGRhdGFzZXQuQklPMlssYygicm93bmFtZXMiLCAicmljaG5lc3MiKV0sIGJ5ID0gInJvd25hbWVzIikNCg0KZ3JhcGguZ2VvLnNwIDwtIGdncGxvdChkYXRhc2V0LlNQQTIsIGFlcyhMb25naXR1ZGUsIExhdGl0dWRlKSkgKw0KICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGFlcyhzaXplID0gcmljaG5lc3MpLCBuYS5ybSA9IFRSVUUpICsNCiAgZ2d0aXRsZShwYXN0ZSgiRGlzdHJpYnV0aW9uIGfDqW9ncmFwaGlxdWUgZGUgbGEgcmljaGVzc2UgZW4gdGF4b25zIikpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMSwxMCksIG5hbWUgPSAiUmljaGVzc2UgZW4gdGF4b25zIikNCmdyYXBoLmdlby5zcA0KDQpgYGANCg0KDQpMYSBjYXJ0ZSBpbnRlcmFjdGl2ZSBzdWl2YW50ZSBpbGx1c3RyZSBsZXMgbcOqbWVzIGRvbm7DqWVzIHF1ZSBsZSBncmFwaGlxdWUgcHLDqWPDqWRlbnQuIENsaXF1ZXogc3VyIGxlIG1hcnF1ZXVyIGQndW5lIHZpc2l0ZSBwb3VyIGluZGlxdWVyIGxhIHJpY2hlc3NlIGVuIHRheG9ucyBvYnNlcnbDqWUgZGFucyBjZWxsZS1jaS4NCg0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NS41LCBmaWcud2lkdGg9OC41LCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQojQ2FydG9ncmFwaGllIGRlIGxhIGRpc3RyaWJ1dGlvbiBkZSBsYSByaWNoZXNzZSBlbiB0YXhvbnMNCg0KZGF0YXNldC5OQU0yIDwtIHJvd25hbWVzX3RvX2NvbHVtbihkYXRhc2V0Lk5BTSwgdmFyID0gInJvd25hbWVzIikNCmRhdGFzZXQuTkFNMiRTaXRlX0RhdGVfTnVtYmVyIDwtIHBhc3RlKGRhdGFzZXQuTkFNMiRTaXRlLCBkYXRhc2V0Lk5BTTIkU2FtcGxlRGF0ZSwgZGF0YXNldC5OQU0yJFNhbXBsZU51bWJlcikNCmRhdGFzZXQuU1BBMiA8LSByb3duYW1lc190b19jb2x1bW4oZGF0YXNldC5TUEEsIHZhciA9ICJyb3duYW1lcyIpDQpkYXRhc2V0LlNQQTIgPC0gbGVmdF9qb2luKGRhdGFzZXQuU1BBMiwgZGF0YXNldC5OQU0yWyxjKCJyb3duYW1lcyIsICJTaXRlX0RhdGVfTnVtYmVyIildLCBieSA9ICJyb3duYW1lcyIpDQpkYXRhc2V0LlNQQTIgPC0gbGVmdF9qb2luKGRhdGFzZXQuU1BBMiwgZGF0YXNldC5OQU0yWywgYygicm93bmFtZXMiLCAiU2l0ZSIsICJTYW1wbGVEYXRlIiwgIlNhbXBsZU51bWJlciIpXSwgYnkgPSAicm93bmFtZXMiKQ0KZGF0YXNldC5TUEEyIDwtIGxlZnRfam9pbihkYXRhc2V0LlNQQTIsIGRhdGFzZXQuQklPMlssIGMoInJvd25hbWVzIiwgInJpY2huZXNzIildLCBieSA9ICJyb3duYW1lcyIpDQpkYXRhc2V0LlNQQTIkU2l0ZV9EYXRlX051bWJlciA8LSBwYXN0ZShkYXRhc2V0LlNQQTIkU2l0ZSwgIl8iLCBkYXRhc2V0LlNQQTIkU2FtcGxlRGF0ZSwgIl8iLCBkYXRhc2V0LlNQQTIkU2FtcGxlTnVtYmVyKQ0KZGF0ZXMgPC0gYXMuRGF0ZShkYXRhc2V0LlNQQTIkU2FtcGxlRGF0ZSwgIiVZLSVtLSVkIikNCmRhdGFzZXQuU1BBMiRZZWFyIDwtIHN0cmZ0aW1lKHBhcnNlX2RhdGVfdGltZShhcy5jaGFyYWN0ZXIoZGF0ZXMpLCAiJVktJW0tJWQiKSwgIiV5IikNCmRhdGFzZXQuU1BBMiRTaXRlX1llYXIgPC0gcGFzdGUoZGF0YXNldC5TUEEyJFNpdGUsICJfIiwgZGF0YXNldC5TUEEyJFllYXIpDQoNCmNhYmluUG9pbnRzIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoY29vcmRzID0gZGF0YXNldC5TUEFbLCAxOjJdLCBkYXRhID0gZGF0YXNldC5TUEEpDQoNCmdldENvbG9yMiA8LSBmdW5jdGlvbihkYXRhc2V0LlNQQTIpIHsNCiAgc2FwcGx5KGRhdGFzZXQuU1BBMiRTYW1wbGVEYXRlLCBmdW5jdGlvbihTYW1wbGVEYXRlKSB7DQogIGlmKFNhbXBsZURhdGUgPD0gIjIwMDUtMTItMzEiKSB7DQogICAgImdyZWVuIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAwNi0xMi0zMSIpIHsNCiAgICAieWVsbG93Ig0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAwNy0xMi0zMSIpIHsNCiAgICAiZGFya29yYW5nZSINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMDgtMTItMzEiKSB7DQogICAgInJlZCINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMDktMTItMzEiKSB7DQogICAgInBpbmsiDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDEwLTEyLTMxIikgew0KICAgICJibHVlIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxMS0xMi0zMSIpIHsNCiAgICAiZGFya2dyZWVuIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxMi0xMi0zMSIpIHsNCiAgICAiY3lhbiINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTMtMTItMzEiKSB7DQogICAgImRlZXBwaW5rIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxNC0xMi0zMSIpIHsNCiAgICAibGlnaHRibHVlIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxNS0xMi0zMSIpIHsNCiAgICAibGlnaHRzZWFncmVlbiINCiAgfSBlbHNlIGlmKFNhbXBsZURhdGUgPD0gIjIwMTYtMTItMzEiKSB7DQogICAgImRhcmt2aW9sZXQiDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDE3LTEyLTMxIikgew0KICAgICJkYXJrcmVkIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxOC0xMi0zMSIpIHsNCiAgICAiY2FkZXRibHVlIg0KICB9IGVsc2UgaWYoU2FtcGxlRGF0ZSA8PSAiMjAxOS0xMi0zMSIpIHsNCiAgICAiYmxhY2siDQogIH0gZWxzZSBpZihTYW1wbGVEYXRlIDw9ICIyMDIwLTEyLTMxIikgew0KICAgICJncmF5Ig0KICB9IGVsc2Ugew0KICAgICJicm93biINCiAgfSB9KQ0KfSANCg0KI2RhdGVzIDwtIGFzLkRhdGUoZGF0YXNldC5TUEEyJFNhbXBsZURhdGUsICIlWS0lbS0lZCIpIA0KI2RhdGFzZXQuU1BBMiRZZWFyIDwtIHN0cmZ0aW1lKHBhcnNlX2RhdGVfdGltZShhcy5jaGFyYWN0ZXIoZGF0ZXMpLCAiJVktJW0tJWQiKSwgIiVZIikNCiAgDQogICAgbGVhZmxldChkYXRhID0gZGF0YXNldC5TUEEyKSAlPiUgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZFRvcG9NYXApICU+JSBhZGRDaXJjbGVNYXJrZXJzKH5Mb25naXR1ZGUsIH5MYXRpdHVkZSwgcG9wdXAgPSBwYXN0ZSggIlN0YXRpb25fQW5uw6llIDoiLCBkYXRhc2V0LlNQQTIkU2l0ZV9ZZWFyLCAiPGJyPiIsICJSaWNoZXNzZSBlbiB0YXhvbnMgOiAiLCBkYXRhc2V0LlNQQTIkcmljaG5lc3MsICI8YnI+IiksIGxhYmVsID0gKGRhdGFzZXQuU1BBMiRTaXRlX1llYXIpLCByYWRpdXMgPSBkYXRhc2V0LlNQQTIkcmljaG5lc3MsIGNvbG9yID0gZ2V0Q29sb3IyKGRhdGFzZXQuU1BBMiksIHN0cm9rZSA9IEYsIGZpbGxPcGFjaXR5ID0gMC41LCBjbHVzdGVyT3B0aW9ucyA9IG1hcmtlckNsdXN0ZXJPcHRpb25zKCkpICU+JSBhZGRMZWdlbmQoDQogIHBvc2l0aW9uID0gJ2JvdHRvbXJpZ2h0JywNCiAgY29sb3JzID0gcGFsZXR0ZSgpLA0KICBsYWJlbHMgPSBwYWxldHRlKCksDQogIG9wYWNpdHkgPSAxLA0KICB0aXRsZSA9ICdMw6lnZW5kZScpDQogIA0Kcm0oZGF0YXNldC5TUEEyKQ0KDQpgYGANCg0KDQojI1Byw6lzZW5jZSBkZSBkb25uw6llcyBhYmVycmFudGVzDQoNCiMjI0RpYWdyYW1tZXMgZGUgZGlzcGVyc2lvbiBkZXMgdmFsZXVycyBvYnNlcnbDqWVzDQoNCkxlcyBkaWFncmFtbWVzIGRlIGRpc3BlcnNpb24gc3VpdmFudHMgcHLDqXNlbnRlbnQgbGEgdmFsZXVyIGRlcyBhYm9uZGFuY2VzIGRlcyB0YXhvbnMgZGFucyBsJ29yZHJlIMOgIGxhcXVlbGxlIGVsbGVzIGFwcGFyYWlzc2VudCBkYW5zIGNlIGZpY2hpZXIuIFNvdXMgbCdheGUgZGVzIFggc2UgdHJvdXZlIGwnaWRlbnRpZmlhbnQgZGUgbGEgdmlzaXRlIHZpcy3DoC12aXMgbGEgdmFsZXVyIG9ic2VydsOpZSBjb3JyZXNwb25kYW50ZSwgc29pdCBsZSBub20gZHUgc2l0ZSBkJ2/DuSBwcm92aWVudCBsYSBkb25uw6llLCBzYSBkYXRlIGQnw6ljaGFudGlsbG9ubmFnZSBldCBsZSBub21icmUgZCfDqWNoYW50aWxsb25uYWdlIHByaXMgcG91ciBjZXR0ZSBkb25uw6llLg0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqRXhhbWluZXogbGVzIHBvaW50cyBzdWl2YW50cyA6Kg0KPiANCj4gDQo+IC0gKkxhIGRpc3RyaWJ1dGlvbiBkZXMgdmFsZXVycyBkJ2Fib25kYW5jZSBpbmRpcXVlLXQnZWxsZSB1biBwaMOpbm9tw6huZSDDqWNvbG9naXF1ZSBvdSB1biBwcm9ibMOobWUgcG90ZW50aWVsPyoNCj4gLSAqRGVzIHRheG9ucyBzb250LWlscyB0csOocyByYXJlcyBvdSBhdSBjb250cmFpcmUgdHLDqHMgZnLDqXF1ZW50cz8qDQo+IC0gKlVuIHByb2Jsw6htZSBhdmVjIGxlcyBkb25uw6llcyBkJ2Fib25kYW5jZSBlc3QtaWwgYXBwYXJlbnQ/Kg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0RpYWdyYW1tZXMgZGUgZGlzcGVyc2lvbiBkZXMgdmFsZXVycyBvYnNlcnbDqWVzDQogIA0KZGF0YXNldC5CSU8yIDwtIGxlZnRfam9pbihkYXRhc2V0LkJJTzIsIGRhdGFzZXQuTkFNMlssYygicm93bmFtZXMiLCAiU2l0ZV9EYXRlX051bWJlciIpXSwgYnkgPSAicm93bmFtZXMiKQ0KDQpmb3IoaiBpbiAyOihuY29sKGRhdGFzZXQuQklPMiktNCkpew0KcGxvdC5hYiA8LSBnZ3Bsb3QoZGF0YXNldC5CSU8yLCBhZXMoeCA9IGRhdGFzZXQuQklPMiRTaXRlX0RhdGVfTnVtYmVyLCB5ID0gZGF0YXNldC5CSU8yWyxqXSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgbGFicyh5ID0gIkFib25kYW5jZSIsIHggPSAiVmlzaXRlIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC0wLjA1KSkgKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBpZmVsc2UoIWlzLm5hKGRhdGFzZXQuQklPMlssal0pLCBkYXRhc2V0LkJJTzIkU2l0ZV9EYXRlX051bWJlciwgIiIpLCBsYWJlbHMgPSBpZmVsc2UoIWlzLm5hKGRhdGFzZXQuQklPMlssal0pLCBkYXRhc2V0LkJJTzIkU2l0ZV9EYXRlX051bWJlciwgIiIpLCBuYS52YWx1ZSA9IE5BKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGdndGl0bGUocGFzdGUoIkFib25kYW5jZSBkZSIsIGNvbG5hbWVzKGRhdGFzZXQuQklPMltqXSksICJwYXIgdmlzaXRlIikpDQpwbG90LmFiDQpwcmludChwbG90LmFiKQ0KfQ0KDQpgYGANCg0KIyMjQm/DrnRlcyDDoCBtb3VzdGFjaGVzIGRlIGwnYWJvbmRhbmNlIHBhciB0YXhvbiBvYnNlcnbDqWUgZXQgdHJhbnNmb3Jtw6llDQoNClBvdXIgY2hhcXVlIHZhcmlhYmxlLCBsYSBwcmVtacOocmUgYm/DrnRlIMOgIG1vdXN0YWNoZXMgKMOgIGdhdWNoZSkgaWxsdXN0cmUgbGEgZGlzdHJpYnV0aW9uIGRlcyBhYm9uZGFuY2VzIG9ic2VydsOpZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzIGV0IGxhIGRldXhpw6htZSBib8OudGUgw6AgbW91c3RhY2hlcyAow6AgZHJvaXRlKSBpbGx1c3RyZSBsYSBkaXN0cmlidXRpb24gZGVzIGFib25kYW5jZXMgb2JzZXJ2w6llcyBkYW5zIGxlIGZpY2hpZXIgZGUgZG9ubsOpZXMgYXlhbnQgc3ViaWVzIHVuZSB0cmFuc2Zvcm1hdGlvbiBsb2dhcml0aG1pcXVlLg0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqRXhhbWluZXogbGVzIHBvaW50cyBzdWl2YW50cyA6Kg0KPiANCj4gDQo+IC0gKkxhIHBvc2l0aW9uIGfDqW9ncmFwaGlxdWUgZGVzIG1lc3VyZXMgZXN0LWVsbGUganVzdGU/Kg0KPiAtICpEZXMgbWVzdXJlcyBkZSByaWNoZXNzZSBzb3J0ZW50LWVsbGVzIGRlIGwnb3JkaW5haXJlPyoNCj4gLSAqVW4gcGF0cm9uIGRlIGRpc3RyaWJ1dGlvbiBkZSBsYSByaWNoZXNzZSBlc3QtaWwgYXBwYXJlbnQ/Kg0KPiAtICpMYSB0cmFuc2Zvcm1hdGlvbiBkZXMgZG9ubsOpZXMgYW3DqWxpb3JlLXQnZWxsZSBsYSBkaXN0cmlidXRpb24gZGVzIGFib25kYW5jZXM/Kg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQm/DrnRlcyDDoCBtb3VzdGFjaGVzIGRlIGwnYWJvbmRhbmNlIHBhciB0YXhvbiBvYnNlcnbDqWUgZXQgdHJhbnNmb3Jtw6llDQoNCmZvcihpIGluIDE6bmNvbChkYXRhc2V0LkJJTykpew0KYm94LmFiLjEgPC0gcXBsb3QoeSA9IGRhdGFzZXQuQklPWyxpXSwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gIkFib25kYW5jZSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZSgiRG9ubsOpZXMgYnJ1dGVzIikNCmJveC5hYi4yIDwtIHFwbG90KHkgPSBkYXRhc2V0LkJJT1ssaV0sIHggPSAiIiwgZ2VvbSA9ICJib3hwbG90IiwgeWxhYiA9ICJMb2coQWJvbmRhbmNlKSIsIGxvZyA9ICJ5IikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBnZ3RpdGxlKCJMb2ciKQ0KYm94LmFiLjMgPC0gcXBsb3QoeSA9IHNxcnQoZGF0YXNldC5CSU9bLGldKSwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gIlNxcnQoQWJvbmRhbmNlKSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2d0aXRsZSgiU3FydCIpDQoNCmdyaWQuYXJyYW5nZShib3guYWIuMSwgYm94LmFiLjIsIGJveC5hYi4zLCBuY29sID0gMywgdG9wID0gY29sbmFtZXMoZGF0YXNldC5CSU9baV0pKQ0KfQ0KDQpgYGANCg0KDQojIyNJZGVudGlmaWNhdGlvbiBkZXMgZG9ubsOpZXMgYWJlcnJhbnRlcyBwb3RlbnRpZWxsZXMNCg0KUG91ciBjaGFxdWUgdmFyaWFibGUsIGxhIHByZW1pw6hyZSBib8OudGUgw6AgbW91c3RhY2hlcyAow6AgZ2F1Y2hlKSBpbGx1c3RyZSBsYSBkaXN0cmlidXRpb24gZGVzIHZhbGV1cnMgZGUgdmFyaWFibGVzIGNvbnRpbnVlcyBvYnNlcnbDqWVzIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcy4gTGUgc2Vjb25kIGdyYXBoaXF1ZSBlc3QgbGUgZ3JhcGhlIGRlIENsZXZlbGFuZCBxdWkgZG9ubmUgcGx1cyBkZSBkw6l0YWlscyBzdXIgbGEgZGlzdHJpYnV0aW9uIGRlcyB2YWxldXJzIG9ic2VydsOpZXMuIExlcyB2YWxldXJzIGQnYWJvbmRhbmNlIHNvbnQgcHLDqXNlbnTDqWVzIGRhbnMgbCdvcmRyZSBkJ2FwcGFyaXRpb24gZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzLg0KDQpMZXMgZG9ubsOpZXMgcHLDqXNlbnRhbnQgdW5lIGlkZW50aWZpY2F0aW9uIHBhciBsZXVyIGlkZW50aWZpYW50IHN1ciBsZXMgZGlhZ3JhbW1lcyByZXByw6lzZW50ZW50IGxlcyBkb25uw6llcyBwb3RlbnRpZWxsZW1lbnQgYWJlcnJhbnRlcyBjb250ZW51ZXMgZGFucyBsZSBmaWNoaWVyIGRlIGRvbm7DqWVzLiBMJ2lkZW50aWZpYW50IGRlIGxhIHZpc2l0ZSBjb3JyZXNwb25kIGF1IG5vbSBkdSBzaXRlIGQnb8O5IHByb3ZpZW50IGxhIGRvbm7DqWUsIHNhIGRhdGUgZCfDqWNoYW50aWxsb25uYWdlIGV0IGxlIG5vbWJyZSBkJ8OpY2hhbnRpbGxvbm5hZ2UgcHJpcyBwb3VyIGNldHRlIGRvbm7DqWUuDQoNCkwnaW50ZXJwcsOpdGF0aW9uIGR1IGdyYXBoZSBkZSBDbGV2ZWxhbmQgc2UgZmFpdCBwYXIgbCdleGFtZW4gZGVzIHBvaW50cyBxdWkgc2UgdHJvdXZlbnQgYXV4IGV4dHLDqW1pdMOpcyBnYXVjaGUgb3UgZHJvaXRlIGR1IGdyYXBoaXF1ZS4gQ2VzIHBvaW50cyBtb250cmVudCBkZXMgYWJvbmRhbmNlcyBsYXJnZW1lbnQgZGlmZsOpcmVudGVzIHBhciByYXBwb3J0IMOgIGxhIG1ham9yaXTDqSBkZXMgb2JzZXJ2YXRpb25zIGV0IHJlcXVpZXJlbnQgdW4gZXhhbWVuIHBsdXMgYXBwcm9mb25kaS4gU2kgdm91cyBjb25jbHVleiBxdWUgY2VzIHZhbGV1cnMgZXh0csOobWVzIHNvbnQgZGVzIGVycmV1cnMgZGUgbWVzdXJlLCBlbGxlcyBkZXZyYWllbnQgw6p0cmUgc3VwcHJpbcOpZXMgZHUgZmljaGllciBkZSBkb25uw6llcyBjYXIgZWxsZXMgZG9taW5lcm9udCBsJ2FuYWx5c2UgZGUgZG9ubsOpZXMuIFNpIGwnb21pc3Npb24gZGUgY2VzIGFib25kYW5jZXMgbidlc3QgcGFzIHVuZSBvcHRpb24sIHVuZSB0cmFuc2Zvcm1hdGlvbiBkZXMgZG9ubsOpZXMgZGV2cmFpdCDDqnRyZSBlbnZpc2Fnw6llLg0KDQo+ICFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9hY3Rpb24ucG5nKQ0KPiAqRXhhbWluZXogbGVzIHBvaW50cyBzdWl2YW50cyA6Kg0KPiANCj4gDQo+IC0gKkxlcyBwb2ludHMgYXV4IGV4dHLDqW1pdMOpcyBkZXMgYm9pdGVzIMOgIG1vdXN0YWNoZSB2b3VzIHNlbWJsZW50LWlscyByZXByw6lzZW50ZXIgZGVzIGRvbm7DqWVzIGFiZXJyYW50ZXM/Kg0KPiAtICpDZXMgbcOqbWVzIHBvaW50cyBzZSBzb250LWlscyBpc29sw6lzICjDoCBnYXVjaGUgb3Ugw6AgZHJvaXRlKSBzdXIgbGUgZ3JhcGhlIGRlIENsZXZlbGFuZD8qDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojSWRlbnRpZmljYXRpb24gZGVzIGRvbm7DqWVzIGFiZXJyYW50ZXMgcG90ZW50aWVsbGVzDQoNCmZvciAoaiBpbiAyOihuY29sKGRhdGFzZXQuQklPMiktNCkpIHsNCiAgYm94cGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGRhdGFzZXQuQklPMiwgYWVzKHggPSAiIiwgeSA9IGRhdGFzZXQuQklPMlssal0pKSArDQogICAgZ2VvbV9ib3hwbG90KCkgKw0KICAgIHlsYWIoIkFib25kYW5jZSIpICsNCiAgICB4bGFiKCIiKSArDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgICBnZ3RpdGxlKCJCb2l0ZSDDoCBtb3VzdGFjaGVzIikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBpZmVsc2UoZGF0YXNldC5CSU8yWyxqXSA8IHF1YW50aWxlKGRhdGFzZXQuQklPMlssal0sIHByb2JzPWMoLjI1KSwgbmEucm0gPSBUKSAtIDEuNSpJUVIoZGF0YXNldC5CSU8yWyxqXSwgbmEucm0gPSBUKXxkYXRhc2V0LkJJTzJbLGpdID4gcXVhbnRpbGUoZGF0YXNldC5CSU8yWyxqXSwgcHJvYnM9YyguNzUpLCBuYS5ybSA9IFQpICsgMS41KklRUihkYXRhc2V0LkJJTzJbLGpdLCBuYS5ybSA9IFQpLCBkYXRhc2V0LkJJTzIkU2l0ZV9EYXRlX051bWJlciwgIiIpKSwgaGp1c3QgPSAtMC4wNSwgc2l6ZSA9IDMpDQoNCiAgZG90Y2hhcnQgPC0gZ2dwbG90KGRhdGEgPSBkYXRhc2V0LkJJTzIsIGFlcyh5ID0gc2VxKGRhdGFzZXQuQklPMlssal0pLCB4ID0gZGF0YXNldC5CSU8yWyxqXSwgbmEucm0gPSBUKSkgKw0KICAgIGdlb21fcG9pbnQobmEucm0gPSBUKSArDQogICAgeWxhYigiT3JkcmUgZGVzIGRvbm7DqWVzIikgKw0KICAgIHhsYWIoIkFib25kYW5jZSIpICsNCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICAgIGdndGl0bGUoIkdyYXBoZSBkZSBDbGV2ZWxhbmQiKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGlmZWxzZShkYXRhc2V0LkJJTzJbLGpdIDwgcXVhbnRpbGUoZGF0YXNldC5CSU8yWyxqXSwgcHJvYnM9YyguMjUpLCBuYS5ybSA9IFQpIC0gMS41KklRUihkYXRhc2V0LkJJTzJbLGpdLCBuYS5ybSA9IFQpfGRhdGFzZXQuQklPMlssal0gPiBxdWFudGlsZShkYXRhc2V0LkJJTzJbLGpdLCBwcm9icz1jKC43NSksIG5hLnJtID0gVCkgKyAxLjUqSVFSKGRhdGFzZXQuQklPMlssal0sIG5hLnJtID0gVCksIGRhdGFzZXQuQklPMiRTaXRlX0RhdGVfTnVtYmVyLCAiIikpLCBoanVzdCA9IC0wLjA1LCBudWRnZV95ID0gMiwgc2l6ZSA9IDMpDQogICAgICAgIA0KICBncmlkLmFycmFuZ2UoYm94cGxvdCwgZG90Y2hhcnQsIG5jb2wgPSAyLCB0b3AgPSBjb2xuYW1lcyhkYXRhc2V0LkJJTzJbal0pKQ0KfQ0KYGBgDQoNCkxhIGxpc3RlIHN1aXZhbnRlIHByw6lzZW50ZSBsZXMgZG9ubsOpZXMgcG90ZW50aWVsbGVtZW50IGFiZXJyYW50ZXMgY29udGVudWVzIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcyBwb3VyIGNoYXF1ZSB2YXJpYWJsZS4gTG9yc3F1ZSBsJ2lkZW50aWZpYW50IGQndW5lIGRvbm7DqWUgeSBlc3QgaW5kaXF1w6ksIGNlbGEgaW5kaXF1ZSBxdWUgY2V0dGUgZG9ubsOpZSByZXByw6lzZW50ZSB1bmUgZG9ubsOpZSBwb3RlbnRpZWxsZW1lbnQgYWJlcnJhbnRlIGNvbnRlbnVlIGRhbnMgbGUgZmljaGllciBkZSBkb25uw6llcy4gTGVzIG1lbnRpb25zICoiIiogaW5kaXF1ZW50IGxlcyBkb25uw6llcyBub24gYWJlcnJhbnRlcyBldCBsZXMgbWVudGlvbnMgKk5BKiBpbmRpcXVlbnQgbGEgcHLDqXNlbmNlIGRlIHZhbGV1cnMgbWFucXVhbnRlcy4gTCdpZGVudGlmaWFudCBkZSBsYSB2aXNpdGUgY29ycmVzcG9uZCBhdSBub20gZHUgc2l0ZSBkJ2/DuSBwcm92aWVudCBsYSBkb25uw6llLCBzYSBkYXRlIGQnw6ljaGFudGlsbG9ubmFnZSBldCBsZSBub21icmUgZCfDqWNoYW50aWxsb25uYWdlIHByaXMgcG91ciBjZXR0ZSBkb25uw6llLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNJZGVudGlmaWNhdGlvbiBkZXMgZG9ubsOpZXMgYWJlcnJhbnRlcyBwb3RlbnRpZWxsZXMgKHN1aXRlKQ0KDQpmb3IgKGogaW4gMjoobmNvbChkYXRhc2V0LkJJTzIpLTUpKSB7DQpwcmludChjb2xuYW1lcyhkYXRhc2V0LkJJTzJbal0pKQ0KbGlzdCA8LSBsaXN0KGlmZWxzZShkYXRhc2V0LkJJTzJbLGpdIDwgcXVhbnRpbGUoZGF0YXNldC5CSU8yWyxqXSwgcHJvYnM9YyguMjUpLCBuYS5ybSA9IFQpIC0gMS41KklRUihkYXRhc2V0LkJJTzJbLGpdLCBuYS5ybSA9IFQpIHwgZGF0YXNldC5CSU8yWyxqXSA+IHF1YW50aWxlKGRhdGFzZXQuQklPMlssal0sIHByb2JzPWMoLjc1KSwgbmEucm0gPSBUKSArIDEuNSpJUVIoZGF0YXNldC5CSU8yWyxqXSwgbmEucm0gPSBUKSwgZGF0YXNldC5CSU8yJFNpdGVfRGF0ZV9OdW1iZXIsICIiKSkNCnNsaXN0IDwtIHVubGlzdChsaXN0KQ0KbGlzdDIgPC0gbGlzdChzbGlzdFtzbGlzdCAhPSAiIl0pDQpwcmludChsaXN0MikNCn0NCg0KYGBgDQoNCg0KIyNQcsOpc2VuY2UgZGUgesOpcm9zIA0KDQojIyNIaXN0b2dyYW1tZSBkZSBmcsOpcXVlbmNlcyBkJ2Fib25kYW5jZXMNCg0KTCdoaXN0b2dyYW1tZSBzdWl2YW50IGlsbHVzdHJlIGxhIGRpc3RyaWJ1dGlvbiBkZXMgZnLDqXF1ZW5jZXMgZCdhYm9uZGFuY2VzIHBhciB0YXhvbiBkdSBmaWNoaWVyIGRlIGRvbm7DqWVzLiBDZSBncmFwaGlxdWUgcGVybWV0IG5vdGFtbWVudCBkJ8OpdmFsdWVyIGxhIHF1YW50aXTDqSBkZSB2YWxldXJzIGQnYWJvbmRhbmNlcyDDqXF1aXZhbGVudGVzIMOgIDAgw6AgdHJhdmVycyB0b3VzIGxlcyB0YXhvbnMgZHUgZmljaGllciBkZSBkb25uw6llcy4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0hpc3RvZ3JhbW1lIGRlIGZyw6lxdWVuY2VzIGQnYWJvbmRhbmNlcw0KDQpkYXRhc2V0LkJJT1tpcy5uYShkYXRhc2V0LkJJTyldIDwtIDANCg0KY291bnQubWVhbiA8LSBtZWFuKHVubGlzdChkYXRhc2V0LkJJTykpDQpjb3VudC5zZCA8LSBzZCh1bmxpc3QoZGF0YXNldC5CSU8pKQ0KDQpjb3VudC5uIDwtIGxlbmd0aCh3aGljaCghaXMubmEodW5saXN0KGRhdGFzZXQuQklPKSkpKQ0KDQpjb3VudC5iaW4gPC0gY2VpbGluZygobWF4KHVubGlzdChkYXRhc2V0LkJJTykpLSBtaW4odW5saXN0KGRhdGFzZXQuQklPKSkpL25jbGFzcy5TdHVyZ2VzKHVubGlzdChkYXRhc2V0LkJJTykpKQ0KDQpncmFwaC5jb3VudCA8LSBnZ3Bsb3QoKSArDQogIGFlcyhyb3VuZCh1bmxpc3QoZGF0YXNldC5CSU8pKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IGNvdW50LmJpbiwgZmlsbCA9IEkoJ2xpZ2h0Ymx1ZScpLCBjb2xvcj1JKCdibGFjaycpKSArDQogIHhsYWIoIlZhbGV1cnMgb2JzZXJ2w6llcyIpICsNCiAgeWxhYigiRnLDqXF1ZW5jZSIpICsgDQogIGdndGl0bGUoIkZyw6lxdWVuY2VzIGQnYWJvbmRhbmNlcyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmdnaXJhcGgoY29kZSA9IHByaW50KGdyYXBoLmNvdW50KSwgem9vbV9tYXggPSAxMCwgaGVpZ2h0X3N2ZyA9IDQpDQoNCmRhdGFzZXQuQklPW2RhdGFzZXQuQklPID09IDBdIDwtIE5BDQoNCmBgYA0KDQoNCiMjI01hdHJpY2UgZGUgY29ycsOpbGF0aW9uIGRlcyBkb3VibGVzIHrDqXJvcw0KDQpMYSBtYXRyaWNlIGRlIGNvcnLDqWxhdGlvbiBzdWl2YW50ZSBpbGx1c3RyZSBsYSBmb3JjZSBkZSBjb3Jyw6lsYXRpb24gcXVpIGV4aXN0ZSBlbnRyZSBkZXV4IHRheG9ucyBwcsOpc2VudGFudCBkZXMgdmFsZXVycyBkJ2Fib25kYW5jZXMgw6lxdWl2YWxlbnRlcyDDoCAwIHBhciBsJ2ludGVuc2l0w6kgZGUgbGEgY291bGV1ci4gVW5lIGNvcnLDqWxhdGlvbiBpbGx1c3Ryw6llIHBhciBsYSBjb3VsZXVyIGJsYW5jaGUgaW5kaXF1ZSB1bmUgZm9yY2UgZGUgY29ycsOpbGF0aW9uIHF1aSB0ZW5kIHZlcnMgdW5lIHZhbGV1ciBkZSAwLjUgZXQgdW5lIGNvcnLDqWxhdGlvbiBpbGx1c3Ryw6llIHBhciBsYSBjb3VsZXVyIGJsZXVlIGZvbmPDqWUgaW5kaXF1ZSB1bmUgZm9yY2UgZGUgY29ycsOpbGF0aW9uIHF1aSB0ZW5kIHZlcnMgdW5lIHZhbGV1ciBkZSAxLiBDZXR0ZSBtYXRyaWNlIGlsbHVzdHJlIMOpZ2FsZW1lbnQgbGEgcHJvcG9ydGlvbiBkZSB2YWxldXJzIGQnYWJvbmRhbmNlcyDDoCAwIHF1ZSBwcsOpc2VudGUgdW4gdGF4b24gcGFyIHJhcHBvcnQgw6AgdG91dGVzIGxlcyB2YWxldXJzIGQnYWJvbmRhbmNlcyBvYnNlcnbDqWVzIGRhbnMgY2UgZGVybmllci4gU2V1bGVtZW50IGxlcyB0YXhvbnMgcHLDqXNlbnRzIGRhbnMgcGx1cyBkZSAyNSUgZGVzIHZpc2l0ZXMgeSBzb250IHJlcHLDqXNlbnTDqXMuIA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTR9DQojTWF0cmljZSBkZSBjb3Jyw6lsYXRpb24gZGVzIGRvdWJsZXMgesOpcm9zIGVudHJlIGxlcyB0YXhvbnMgLSB0YXhvbnMgYXZlYyBmcsOpcXVlbmNlID4gMjUlDQoNCmRhdGFzZXQuQklPW2lzLm5hKGRhdGFzZXQuQklPKV0gPC0gMA0KDQojTGlzdGUgZGVzIHRheG9ucw0KQWxsUyA8LSBuYW1lcyhkYXRhc2V0LkJJTykNCg0KI0TDqXRlcm1pbmUgbGEgcmljaGVzc2UNCm9jY3VycmVuY2UgPC0gY29sU3VtcyhkYXRhc2V0LkJJT1ssQWxsU10gPiAwLCBuYS5ybSA9IFRSVUUpDQoNCiNTdXBwcmltZSB0b3V0ZXMgbGVzIGNvdmFyaWFibGVzDQpCZW50aG9zIDwtIGRhdGFzZXQuQklPWyxBbGxTXQ0KDQojQWZpbiBkZSByw6lkdWlyZSBsZSBub21icmUgZGUgdGF4b25zIHN1ciBsYSBmaWd1cmUsIG5vdXMgdXRpbGlzZXJvbnMgbGVzIHRheG9ucyBxdWkgc29udCBwcsOpc2VudHMgZGFucyBwbHVzIGRlIDI1JSBkZXMgdmlzaXRlcy4NCkZyZXFNaW4gPC0gMjUNCkJlbnRob3MyNSA8LSBCZW50aG9zWywgb2NjdXJyZW5jZSA+IChuY29sKEJlbnRob3MpLzEwMCpGcmVxTWluKV0NCnJtKEJlbnRob3MpDQpOIDwtIG5jb2woQmVudGhvczI1KQ0KDQoNCkFsbE5hbWVzIDwtIG5hbWVzKEJlbnRob3MyNSkNCkEgPC0gbWF0cml4KG5yb3cgPSBOLCBuY29sID0gTikNCg0KZm9yIChpIGluIDE6Til7DQogIGZvciAoaiBpbiAxOk4pew0KICAgIEFbaSxqXSA8LSBzdW0oZGF0YXNldC5CSU9bLEFsbFNbaV1dPT0wICAmIGRhdGFzZXQuQklPWyxBbGxTW2pdXT09MCwgbmEucm09VFJVRSkNCiAgfQ0KfQ0KDQoNCkExIDwtIEEvbnJvdyhCZW50aG9zMjUpDQojcHJpbnQoQTEsIGRpZ2l0cyA9IDIpDQpyb3duYW1lcyhBMSkgPC0gQWxsTmFtZXMNCmNvbG5hbWVzKEExKSA8LSBBbGxOYW1lcw0KDQpwYW5lbC5jb3JyZ3JhbS4yIDwtIGZ1bmN0aW9uKHgsIHksIHosIHN1YnNjcmlwdHMsIGF0ID0gcHJldHR5KHopLCBzY2FsZSA9IDAuOCwgLi4uKQ0Kew0KICAgIHJlcXVpcmUoImdyaWQiLCBxdWlldGx5ID0gVFJVRSkNCiAgICB4IDwtIGFzLm51bWVyaWMoeClbc3Vic2NyaXB0c10NCiAgICB5IDwtIGFzLm51bWVyaWMoeSlbc3Vic2NyaXB0c10NCiAgICB6IDwtIGFzLm51bWVyaWMoeilbc3Vic2NyaXB0c10NCiAgICB6Y29sIDwtIGxldmVsLmNvbG9ycyh6LCBhdCA9IGF0LCAuLi4pDQogICAgZm9yIChpIGluIHNlcShhbG9uZyA9IHopKQ0KICAgIHsNCiAgICAgICAgbGltcyA8LSByYW5nZSgwLCB6W2ldKQ0KICAgICAgICB0dmFsIDwtIDIgKiBiYXNlOjpwaSAqDQogICAgICAgICAgICBzZXEoZnJvbSA9IGxpbXNbMV0sIHRvID0gbGltc1syXSwgYnkgPSAwLjAxKQ0KICAgICAgICBncmlkLmNpcmNsZSh4ID0geFtpXSwgeSA9IHlbaV0sIHIgPSAuNSAqIHNjYWxlLA0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LnVuaXRzID0gIm5hdGl2ZSIpDQogICAgICAgIGdyaWQucG9seWdvbih4ID0geFtpXSArIC41ICogc2NhbGUgKiBjKDAsIHNpbih0dmFsKSksDQogICAgICAgICAgICAgICAgICAgICB5ID0geVtpXSArIC41ICogc2NhbGUgKiBjKDAsIGNvcyh0dmFsKSksDQogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LnVuaXRzID0gIm5hdGl2ZSIsDQogICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZmlsbCA9IHpjb2xbaV0pKQ0KICAgIH0NCn0NCg0KbGV2ZWxwbG90KEExLHhsYWI9TlVMTCx5bGFiPU5VTEwsDQogICAgYXQ9ZG8uYnJlYWtzKGMoMC41LDEuMDEpLDEwMSksDQogICAgcGFuZWw9cGFuZWwuY29ycmdyYW0uMiwNCiAgICBzY2FsZXM9bGlzdCh4PWxpc3Qocm90PTkwKSksDQogICAgY29sb3JrZXk9bGlzdChzcGFjZT0idG9wIiksDQogICAgY29sLnJlZ2lvbnM9Y29sb3JSYW1wUGFsZXR0ZShjKCJ3aGl0ZSIsImJsdWUiKSksIA0KICAgIG1haW4gPSAiRm9yY2UgZGUgY29ycsOpbGF0aW9uIGVudHJlIGxlcyB2YXJpYWJsZXMgcHLDqXNlbnRhbnQgZGVzIGRvdWJsZXMgesOpcm9zIikNCg0KZGF0YXNldC5CSU9bZGF0YXNldC5CSU8gPT0gMF0gPC0gTkENCg0KYGBgDQoNCg0KIyNOb3JtYWxpdMOpIGRlcyBkb25uw6llcyANCg0KIyMjRGlhZ3JhbW1lcyBRdWFudGlsZS1RdWFudGlsZSBldCBoaXN0b2dyYW1tZXMgZGUgZnLDqXF1ZW5jZXMNCg0KUG91ciBjaGFxdWUgdmFyaWFibGUsIGxlIHByZW1pZXIgZ3JhcGhpcXVlICjDoCBnYXVjaGUpIGlsbHVzdHJlIGxhIGRpc3RyaWJ1dGlvbiBvYnNlcnbDqWUgZGVzIHZhbGV1cnMgcGFyIHRheG9uIHBhciBkZXMgcG9pbnRzIGV0IGxhIGRpc3RyaWJ1dGlvbiBub3JtYWxlIHRow6lvcmlxdWUgY2FsY3Vsw6llIMOgIHBhcnRpciBkZXMgcGFyYW3DqHRyZXMgZGUgbGEgZGlzdHJpYnV0aW9uIG9ic2VydsOpZSBwYXIgdW5lIGRyb2l0ZS4gUGx1cyBsZXMgdmFsZXVycyBvYnNlcnbDqWVzIHNvbnQgcG9zaXRpb25uw6llcyBzdXIgbGEgZHJvaXRlLCBwbHVzIGNlbGxlcy1jaSBzb250IGRpc3RyaWJ1w6llcyBzZWxvbiBsYSBsb2kgbm9ybWFsZS4gTGUgZGV1eGnDqG1lIGdyYXBoaXF1ZSAow6AgZHJvaXRlKSBpbGx1c3RyZSBwYXIgdW4gaGlzdG9ncmFtbWUgbGEgZGlzdHJpYnV0aW9uIGRlcyBmcsOpcXVlbmNlcyBkZXMgdmFsZXVycyBvYnNlcnbDqWVzIHBhciB0YXhvbi4gSWwgcGVybWV0IG5vdGFtbWVudCBkZSB2w6lyaWZpZXIgZXQgdmFsaWRlciBzaSBsYSBkaXN0cmlidXRpb24gZGVzIGRvbm7DqWVzIHNlbWJsZSBzdWl2cmUgbGEgbG9pIG5vcm1hbGUuIENldCBoaXN0b2dyYW1tZSBpbGx1c3RyZSDDqWdhbGVtZW50IGwnYWJvbmRhbmNlIG1veWVubmUgcGFyIHRheG9uIHBhciB1bmUgbGlnbmUgcGxlaW5lIGFpbnNpIHF1ZSBsJ8OpY2FydC10eXBlIGRlcyBhYm9uZGFuY2VzIHBhciB0YXhvbiBwYXIgZGV1eCBsaWduZXMgcG9pbnRpbGzDqWVzLiANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojRGlhZ3JhbW1lcyBRdWFudGlsZS1RdWFudGlsZSBldCBoaXN0b2dyYW1tZXMgZGUgZnLDqXF1ZW5jZXMNCg0KZm9yIChpIGluIDE6bmNvbChkYXRhc2V0LkJJTykpew0Kbm9ybS5tZWFuIDwtIG1lYW4od2hpY2goIWlzLm5hKGRhdGFzZXQuQklPWyxpXSkpKQ0Kbm9ybS5zZCA8LSBzZCh3aGljaCghaXMubmEoZGF0YXNldC5CSU9bLGldKSkpDQpub3JtLm4gPC0gbGVuZ3RoKHdoaWNoKCFpcy5uYShkYXRhc2V0LkJJT1ssaV0pKSkNCm5vcm0uYmluIDwtIGNlaWxpbmcobWF4KHdoaWNoKCFpcy5uYShkYXRhc2V0LkJJT1ssaV0pKSktIG1pbih3aGljaCghaXMubmEoZGF0YXNldC5CSU9bLGldKSkpL25jbGFzcy5TdHVyZ2VzKHdoaWNoKCFpcy5uYShkYXRhc2V0LkJJT1ssaV0pKSkpDQoNCnBhcihtZnJvdyA9IGMoMSwyKSwgbWFyPWMoNCw0LDMsMSkpDQoNCnFxbm9ybShkYXRhc2V0LkJJT1ssaV0sIG1haW4gPSBwYXN0ZSgiRGlhZ3JhbW1lIFF1YW50aWxlLVF1YW50aWxlXG5kZSIsIGNvbG5hbWVzKGRhdGFzZXQuQklPW2ldKSkpDQpxcWxpbmUoZGF0YXNldC5CSU9bLGldLGx0eSA9IDIpDQoNCmhpc3QuYWIgPC0gaGlzdChhcy5udW1lcmljKHVubGlzdChkYXRhc2V0LkJJT1ssaV0pKSwgYnJlYWtzID0gIlN0dXJnZXMiLCB4bGFiID0gIkFib25kYW5jZSIsIHlsYWIgPSAiRnLDqXF1ZW5jZSIsIG1haW4gPSBwYXN0ZSgiRnLDqXF1ZW5jZXMgZCdhYm9uZGFuY2VzXG5kZSIsIGNvbG5hbWVzKGRhdGFzZXQuQklPW2ldKSkpDQp4Zml0IDwtIHNlcShtaW4od2hpY2goIWlzLm5hKGRhdGFzZXQuQklPWyxpXSkpKSwgbWF4KHdoaWNoKCFpcy5uYShkYXRhc2V0LkJJT1ssaV0pKSksIGxlbmd0aD1ub3JtLm4pDQp5Zml0X2RlbnNpdHkgPC0gZG5vcm0oeGZpdCwgbWVhbiA9IG5vcm0ubWVhbiwgc2Q9bm9ybS5zZCkNCnlmaXRfZnJlcSA8LSB5Zml0X2RlbnNpdHkqZGlmZihoaXN0LmFiJG1pZHNbMToyXSkqbm9ybS5uDQpsaW5lcyh4Zml0LCB5Zml0X2ZyZXEsIGNvbD0icmVkIiwgbHdkPTEpDQogIGFibGluZSh2ID0gbm9ybS5tZWFuLCBjb2wgPSAiYmx1ZSIpICsNCiAgYWJsaW5lKHYgPSBub3JtLm1lYW4gKyBub3JtLnNkLCBsdHkgPSAyLCBjb2wgPSAiYmx1ZSIpICsNCiAgYWJsaW5lKHYgPSBub3JtLm1lYW4gLSBub3JtLnNkLCBsdHkgPSAyLCBjb2wgPSAiYmx1ZSIpDQogIH0NCg0KYGBgDQoNCg0KIyMjTm9ybWFsaXTDqSBkZXMgZG9ubsOpZXMNCg0KIyMjI1Rlc3RzIGRlIG5vcm1hbGl0w6kgcGFyIHRheG9uDQoNCkxlcyByw6lzdWx0YXRzIHN1aXZhbnRzIHByw6lzZW50ZW50IGxlIHLDqXN1bHRhdCBvYnRlbnUgcGFyIHVuIHRlc3QgZGUgU25vd3MgYXBwbGlxdcOpIHN1ciBjaGFxdWUgdmFyaWFibGUgZHUgZmljaGllciBkZSBkb25uw6llcy4gVW5lIHZhbGV1ciBkZSBQIChwLXZhbHVlKSBpbmbDqXJpZXVyZSDDoCAwLjA1IGluZGlxdWUgcXUnaWwgbidlc3QgcGFzIHBvc3NpYmxlIGRlIHN1cHBvc2VyIHF1ZSBsYSBkaXN0cmlidXRpb24gZGVzIGRvbm7DqWVzIHN1aXQgbGEgbG9pIG5vcm1hbGUgYXZlYyB1bmUgcHJvYmFiaWxpdMOpIGRlIDk1JS4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1Rlc3RzIGRlIG5vcm1hbGl0w6kgZGUgU25vd3MgcGFyIHZhcmlhYmxlIA0KDQphcHBseShkYXRhc2V0LkJJTywgMiwgU25vd3NQZW51bHRpbWF0ZU5vcm1hbGl0eVRlc3QpDQoNCmBgYA0KDQoNCiMjIyNPY2N1cmVuY2UgZW4gdGF4b25zDQoNCkRhbnMgY29tYmllbiBkZSBzaXRlcyBjaGFxdWUgdGF4b24gZXN0LWlsIHByw6lzZW50PyANCg0KTGEgbGlzdGUgcXVpIHN1aXQgbW9udHJlIGVuIG9yZHJlIGNyb2lzc2FudCBsJ29jY3VyZW5jZSBkZXMgdGF4b25zIGRhbnMgbGUgamV1IGRlIGRvbm7DqWVzLg0KDQpQYXIgbGEgc3VpdGUsIGRldXggZ3JhcGhpcXVlcyBzb250IHByb3Bvc8Opcy4gTGUgcHJlbWllciBncmFwaGlxdWUgKMOgIGdhdWNoZSkgaWxsdXN0cmUgbGEgZGlzdHJpYnV0aW9uIGRlcyBmcsOpcXVlbmNlcyBkZXMgdmFsZXVycyBkJ29jY3VycmVuY2UgZW4gdGF4b25zLiBMZSBkZXV4acOobWUgZ3JhcGhpcXVlICjDoCBkcm9pdGUpIG1vbnRyZSBsYSBkaXN0cmlidXRpb24gZGVzIGZyw6lxdWVuY2VzIGRlcyB2YWxldXJzIGNhbGN1bMOpZXMgZCdvY2N1cnJlbmNlIGVuIHRheG9ucyDDoCBwYXJ0aXIgZHUgZmljaGllciBkZSBkb25uw6llcyBheWFudCBzdWJpZXMgdW5lIHRyYW5zZm9ybWF0aW9uIGxvZ2FyaXRobWlxdWUuIENldCBoaXN0b2dyYW1tZSBpbGx1c3RyZSDDqWdhbGVtZW50IGwnb2NjdXJyZW5jZSBtb3llbm5lIHBhciB0YXhvbiBwYXIgdW5lIGxpZ25lIHBsZWluZSBhaW5zaSBxdWUgbCfDqWNhcnQtdHlwZSBkZXMgb2NjdXJyZW5jZXMgcGFyIHRheG9uIHBhciBkZXV4IGxpZ25lcyBwb2ludGlsbMOpZXMuIA0KDQpVbiBleGFtZW4gZGUgY2VzIGRldXggZ3JhcGhpcXVlcyBwZXJtZXQgbm90YW1tZW50IGRlIHbDqXJpZmllciBzaSBsYSBkaXN0cmlidXRpb24gZGVzIGRvbm7DqWVzIHNlbWJsZSBzdWl2cmUgbGEgbG9pIG5vcm1hbGUuIFNpIGxhIGRpc3RyaWJ1dGlvbiBkZXMgZG9ubsOpZXMgc3VyIGxlIGRldXhpw6htZSBncmFwaGlxdWUgc2VtYmxlIHJlc3NlbWJsZXIgZGF2YW50YWdlIMOgIHVuZSBkaXN0cmlidXRpb24gbm9ybWFsZSwgdW5lIHRyYW5zZm9ybWF0aW9uIGxvZ2FyaXRobWlxdWUgZGVzIGRvbm7DqWVzIHBvdXJyYWl0IMOqdHJlIG7DqWNlc3NhaXJlLiANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojSGlzdG9ncmFtbWVzIGRlIGwnb2NjdXJyZW5jZSBlbiB0YXhvbnMNCg0Kc3BlLnByZXMgPC0gYXBwbHkoZGF0YXNldC5CSU8gPiAwLCAyLCBzdW0sIG5hLnJtID0gVFJVRSkNCnNwZS5wcmVzDQpwcmludCgiT3JkcmUgY3JvaXNzYW50IGRlcyBvY2N1cnJlbmNlcyBlbiB0YXhvbnMiKQ0Kc29ydChzcGUucHJlcykNCnNwZS5wcmVzLm1lYW4gPC0gbWVhbihzcGUucHJlcywgbmEucm0gPSBUKQ0Kc3BlLnByZXMuc2QgPC0gc2Qoc3BlLnByZXMsIG5hLnJtID0gVCkNCg0KcHJlcy5uIDwtIGxlbmd0aCh3aGljaCghaXMubmEoc3BlLnByZXMpKSkNCg0KcHJlcy5iaW4gPC0gY2VpbGluZygobWF4KHNwZS5wcmVzKS0gbWluKHNwZS5wcmVzKSkvbmNsYXNzLlN0dXJnZXMoc3BlLnByZXMpKQ0KDQpncmFwaC5wcmVzMSA8LSBxcGxvdChzcGUucHJlcywNCiAgICAgIGdlb20gPSAiaGlzdG9ncmFtIiwNCiAgICAgIGJpbndpZHRoID0gcHJlcy5iaW4sDQogICAgICB4bGFiID0gIk9jY3VycmVuY2UiLA0KICAgICAgeWxhYiA9ICJOb21icmUgZGUgdGF4b25zIiwNCiAgICAgIG1haW4gPSAiT2NjdXJyZW5jZXMgZW4gdGF4b25zIiwNCiAgICAgIGZpbGwgPSBJKCdsaWdodHN0ZWVsYmx1ZTEnKSwNCiAgICAgIGNvbG9yID0gSSgnYmxhY2snKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gc3BlLnByZXMubWVhbiwNCiAgICAgICAgICAgICAgY29sb3IgPSAnYmx1ZTMnLCBzaXplID0gMSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKHNwZS5wcmVzLm1lYW4gKyBzcGUucHJlcy5zZCwgc3BlLnByZXMubWVhbiAtIHNwZS5wcmVzLnNkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICdibHVlMycsIA0KICAgICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gMikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGZ1bmN0aW9uKHgsIG1lYW4sIHNkLCBuLCBidyl7DQogICAgbiAqIGJ3ICogZG5vcm0oeCA9IHgsIG1lYW4gPSBtZWFuLCBzZCA9IHNkKX0sDQogICAgYXJncyA9IGxpc3QobWVhbiA9IHNwZS5wcmVzLm1lYW4sIHNkID0gc3BlLnByZXMuc2QsIG4gPSBwcmVzLm4sIGJ3ID0gcHJlcy5iaW4pLA0KICAgIGx3ZCA9IDEsDQogICAgY29sID0gJ3JlZCcpDQoNCmdyYXBoLnByZXMyIDwtIHFwbG90KHNwZS5wcmVzLA0KICAgICAgZ2VvbSA9ICJoaXN0b2dyYW0iLA0KICAgICAgYmlud2lkdGggPSBwcmVzLmJpbiwNCiAgICAgIHhsYWIgPSAiT2NjdXJyZW5jZSIsDQogICAgICB5bGFiID0gIkxvZyhOb21icmUgZGUgdGF4b25zKSIsDQogICAgICBtYWluID0gIk9jY3VycmVuY2VzIGVuIHRheG9ucyIsDQogICAgICBmaWxsID0gSSgnbGlnaHRzdGVlbGJsdWUxJyksDQogICAgICBjb2xvciA9IEkoJ2JsYWNrJyksDQogICAgICBsb2cgPSAneScpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNwZS5wcmVzLm1lYW4sDQogICAgICAgICAgICAgIGNvbG9yID0gJ2JsdWUzJywgc2l6ZSA9IDEpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyhzcGUucHJlcy5tZWFuICsgc3BlLnByZXMuc2QsIHNwZS5wcmVzLm1lYW4gLSBzcGUucHJlcy5zZCksDQogICAgICAgICAgICAgY29sb3IgPSAnYmx1ZTMnLCANCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9IDIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgbiwgYncpew0KICAgIG4gKiBidyAqIGRub3JtKHggPSB4LCBtZWFuID0gbWVhbiwgc2QgPSBzZCl9LA0KICAgIGFyZ3MgPSBsaXN0KG1lYW4gPSBzcGUucHJlcy5tZWFuLCBzZCA9IHNwZS5wcmVzLnNkLCBuID0gcHJlcy5uLCBidyA9IHByZXMuYmluKSwNCiAgICBsd2QgPSAxLA0KICAgIGNvbCA9ICdyZWQnKQ0KDQpncmlkLmFycmFuZ2UoZ3JhcGgucHJlczEsIGdyYXBoLnByZXMyLCBuY29sID0gMikNCg0KYGBgDQoNCg0KTGVzIGdyYXBoaXF1ZXMgc3VpdmFudHMgc29udCBzaW1pbGFpcmVzIGF1eCBwcsOpY8OpZGVudHMgbWFpcyBwb3VyIGxlcyBmcsOpcXVlbmNlcyByZWxhdGl2ZXMuIA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNIaXN0b2dyYW1tZXMgZGUgZnLDqXF1ZW5jZXMgcmVsYXRpdmVzIGVuIHRheG9ucw0KDQpzcGUucmVsZiA8LSAxMDAqc3BlLnByZXMvbnJvdyhkYXRhc2V0LkJJTykNCnNwZS5yZWxmDQpwcmludCgiT3JkcmUgY3JvaXNzYW50IGRlcyBmcsOpcXVlbmNlcyByZWxhdGl2ZXMgZW4gdGF4b25zIikNCnJvdW5kKHNvcnQoc3BlLnJlbGYpLCAxKQ0Kc3BlLnJlbGYubWVhbiA8LSBtZWFuKHNwZS5yZWxmKQ0Kc3BlLnJlbGYuc2QgPC0gc2Qoc3BlLnJlbGYpDQoNCnJlbGYubiA8LSBsZW5ndGgod2hpY2goIWlzLm5hKHNwZS5yZWxmKSkpDQoNCnJlbGYuYmluIDwtIGNlaWxpbmcoKG1heChzcGUucmVsZiktIG1pbihzcGUucmVsZikpL25jbGFzcy5TdHVyZ2VzKHNwZS5yZWxmKSkNCg0KZ3JhcGgucmVsZjEgPC0gcXBsb3Qoc3BlLnJlbGYsDQogICAgICBnZW9tID0gImhpc3RvZ3JhbSIsDQogICAgICBiaW53aWR0aCA9IHJlbGYuYmluLA0KICAgICAgeGxhYiA9ICJGcsOpcXVlbmNlIGQnb2NjdXJyZW5jZSAoJSkiLA0KICAgICAgeWxhYiA9ICJOb21icmUgZGUgdGF4b25zIiwNCiAgICAgIG1haW4gPSAiRnLDqXF1ZW5jZXMgcmVsYXRpdmVzIGVuIHRheG9ucyIsDQogICAgICBmaWxsID0gSSgnbGlnaHRzdGVlbGJsdWUxJyksDQogICAgICBjb2xvciA9IEkoJ2JsYWNrJykpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHNwZS5yZWxmLm1lYW4sDQogICAgICAgICAgICAgIGNvbG9yID0gJ2JsdWUzJywgc2l6ZSA9IDEpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyhzcGUucmVsZi5tZWFuICsgc3BlLnJlbGYuc2QsIHNwZS5yZWxmLm1lYW4gLSBzcGUucmVsZi5zZCksDQogICAgICAgICAgICAgY29sb3IgPSAnYmx1ZTMnLCANCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9IDIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgbiwgYncpew0KICAgIG4gKiBidyAqIGRub3JtKHggPSB4LCBtZWFuID0gbWVhbiwgc2QgPSBzZCl9LA0KICAgIGFyZ3MgPSBsaXN0KG1lYW4gPSBzcGUucHJlcy5tZWFuLCBzZCA9IHNwZS5wcmVzLnNkLCBuID0gcmVsZi5uLCBidyA9IHJlbGYuYmluKSwNCiAgICBsd2QgPSAxLA0KICAgIGNvbCA9ICdyZWQnKQ0KDQpncmFwaC5yZWxmMiA8LSBxcGxvdChzcGUucmVsZiwNCiAgICAgIGdlb20gPSAiaGlzdG9ncmFtIiwNCiAgICAgIGJpbndpZHRoID0gcmVsZi5iaW4sDQogICAgICB4bGFiID0gIkZyw6lxdWVuY2UgZCdvY2N1cnJlbmNlICglKSIsDQogICAgICB5bGFiID0gIkxvZyhOb21icmUgZGUgdGF4b25zKSIsDQogICAgICBtYWluID0gIkZyw6lxdWVuY2VzIHJlbGF0aXZlcyBlbiB0YXhvbnMgKGxvZykiLA0KICAgICAgZmlsbCA9IEkoJ2xpZ2h0c3RlZWxibHVlMScpLA0KICAgICAgY29sb3IgPSBJKCdibGFjaycpLA0KICAgICAgbG9nID0gInkiKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBzcGUucmVsZi5tZWFuLA0KICAgICAgICAgICAgICBjb2xvciA9ICdibHVlMycsIHNpemUgPSAxKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoc3BlLnJlbGYubWVhbiArIHNwZS5yZWxmLnNkLCBzcGUucmVsZi5tZWFuIC0gc3BlLnJlbGYuc2QpLA0KICAgICAgICAgICAgIGNvbG9yID0gJ2JsdWUzJywgDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgbGluZXR5cGUgPSAyKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QsIG4sIGJ3KXsNCiAgICBuICogYncgKiBkbm9ybSh4ID0geCwgbWVhbiA9IG1lYW4sIHNkID0gc2QpfSwNCiAgICBhcmdzID0gbGlzdChtZWFuID0gc3BlLnByZXMubWVhbiwgc2QgPSBzcGUucHJlcy5zZCwgbiA9IHJlbGYubiwgYncgPSByZWxmLmJpbiksDQogICAgbHdkID0gMSwNCiAgICBjb2wgPSAncmVkJykNCg0KZ3JpZC5hcnJhbmdlKGdyYXBoLnJlbGYxLCBncmFwaC5yZWxmMiwgbmNvbCA9IDIpDQoNCmBgYA0KDQoNCiMjIyNCb8OudGVzIMOgIG1vdXN0YWNoZXMgZCdvY2N1cnJlbmNlcyBlbiB0YXhvbnMNCg0KTGEgcHJlbWnDqHJlIGJvw650ZSDDoCBtb3VzdGFjaGVzICjDoCBnYXVjaGUpIGlsbHVzdHJlIGxhIGRpc3RyaWJ1dGlvbiBkZXMgb2NjdXJyZW5jZXMgY2FsY3Vsw6llcyDDoCBwYXJ0aXIgZHUgZmljaGllciBkZSBkb25uw6llcyBldCBsYSBkZXV4acOobWUgYm/DrnRlIMOgIG1vdXN0YWNoZXMgKMOgIGRyb2l0ZSkgaWxsdXN0cmUgbGEgZGlzdHJpYnV0aW9uIGRlcyBvY2N1cnJlbmNlcyBjYWxjdWzDqWVzIMOgIHBhcnRpciBkdSBmaWNoaWVyIGRlIGRvbm7DqWVzIGF5YW50IHN1YmllcyB1bmUgdHJhbnNmb3JtYXRpb24gbG9nYXJpdGhtaXF1ZS4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojQm/DrnRlcyDDoCBtb3VzdGFjaGVzIGQnb2NjdXJyZW5jZXMgZW4gdGF4b25zDQoNCmJveC5wcmVzMSA8LSBxcGxvdCh5ID0gc3BlLnByZXMsIHggPSAiIiwgZ2VvbSA9ICJib3hwbG90IiwgeWxhYiA9ICJPY2N1cnJlbmNlIiwgbWFpbiA9ICJEaXN0cmlidXRpb24gZGVzIG9jY3VycmVuY2VzIGVuIHRheG9ucyIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYm94LnByZXMyIDwtIHFwbG90KHkgPSBzcGUucHJlcywgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gIkxvZyhPY2N1cnJlbmNlKSIsIG1haW4gPSAiRGlzdHJpYnV0aW9uIGRlcyBvY2N1cnJlbmNlcyBlbiB0YXhvbnMiLCBsb2cgPSAieSIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpncmlkLmFycmFuZ2UoYm94LnByZXMxLCBib3gucHJlczIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KTGVzIGdyYXBoaXF1ZXMgc3VpdmFudHMgc29udCBzaW1pbGFpcmVzIGF1eCBwcsOpY8OpZGVudHMgbWFpcyBwb3VyIGxlcyBmcsOpcXVlbmNlcyByZWxhdGl2ZXMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojQm/DrnRlcyDDoCBtb3VzdGFjaGVzIGRlIGZyw6lxdWVuY2VzIHJlbGF0aXZlcyBlbiB0YXhvbnMNCg0KYm94LnJlbGYxIDwtIHFwbG90KHkgPSBzcGUucmVsZiwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gIkZyw6lxdWVuY2UgZCdvY2N1cnJlbmNlICglKSIsIG1haW4gPSAiRGlzdHJpYnV0aW9uIGRlcyBmcsOpcXVlbmNlc1xucmVsYXRpdmVzIGVuIHRheG9ucyIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYm94LnJlbGYyIDwtIHFwbG90KHkgPSBzcGUucmVsZiwgeCA9ICIiLCBnZW9tID0gImJveHBsb3QiLCB5bGFiID0gIkxvZyhGcsOpcXVlbmNlIGQnb2NjdXJyZW5jZSAoJSkpIiwgbWFpbiA9ICJEaXN0cmlidXRpb24gZGVzIGZyw6lxdWVuY2VzXG5yZWxhdGl2ZXMgZW4gdGF4b25zIiwgbG9nID0gInkiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KZ3JpZC5hcnJhbmdlKGJveC5yZWxmMSwgYm94LnJlbGYyLCBuY29sID0gMikNCg0KYGBgDQoNCg0KIyNJbmTDqXBlbmRhbmNlIGRlcyB0YXhvbnMNCg0KIyMjTWF0cmljZSBkZSBjb3Jyw6lsYXRpb24gZW50cmUgbGVzIHRheG9ucw0KDQpMYSBtYXRyaWNlIGRlIGNvcnLDqWxhdGlvbiBzdWl2YW50ZSBpbGx1c3RyZSBsYSByZWxhdGlvbiBxdWkgZXhpc3RlIGVudHJlIGRldXggdGF4b25zIHBhciBsYSBwcsOpc2VuY2UgZCd1bmUgY291cmJlLiBFbGxlIHBlcm1ldCBub3RhbW1lbnQgZGUgdsOpcmlmaWVyIGV0IHZhbGlkZXIgbGEgcHLDqXNlbmNlIGRlIGNvcnLDqWxhdGlvbiBlbnRyZSBkZXMgdGF4b25zLiBTZXVsZW1lbnQgbGVzIHRheG9ucyBwcsOpc2VudHMgZGFucyBwbHVzIGRlIDI1JSBkZXMgdmlzaXRlcyB5IHNvbnQgcmVwcsOpc2VudMOpcy4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI01hdHJpY2UgZGUgY29ycsOpbGF0aW9uIGVudHJlIGxlcyB2YXJpYWJsZXMgLSB0YXhvbnMgYXZlYyBmcsOpcXVlbmNlID4gMjUlDQoNClBsb3RNYXRyaXgoQmVudGhvczI1LCBwYW5lbCA9IHBhbmVsLnNtb290aCkNCg0KYGBgDQoNCg0KIyMjTWF0cmljZSBkZSBjb3Jyw6lsYXRpb24gZGUgUGVhcnNvbiBnbG9iYWxlDQoNCkxhIG1hdHJpY2UgZGUgY29ycsOpbGF0aW9uIHN1aXZhbnRlIGlsbHVzdHJlIGxhIGZvcmNlIGRlIGNvcnLDqWxhdGlvbiBxdWkgZXhpc3RlIGVudHJlIGRldXggdGF4b25zIHBhciBsJ2ludGVuc2l0w6kgZGUgbGEgY291bGV1ci4gVW5lIGNvcnLDqWxhdGlvbiBpbGx1c3Ryw6llIHBhciBsYSBjb3VsZXVyIGJsYW5jaGUgaW5kaXF1ZSB1bmUgZm9yY2UgZGUgY29ycsOpbGF0aW9uIHF1aSB0ZW5kIHZlcnMgdW5lIHZhbGV1ciBkZSAwIGV0IHVuZSBjb3Jyw6lsYXRpb24gaWxsdXN0csOpZSBwYXIgbGEgY291bGV1ciBibGV1ZSBmb25jw6llIGluZGlxdWUgdW5lIGZvcmNlIGRlIGNvcnLDqWxhdGlvbiBxdWkgdGVuZCB2ZXJzIHVuZSB2YWxldXIgZGUgMS4gTGVzIHZhbGV1cnMgZGUgY29ycsOpbGF0aW9uIGRlIFBlYXJzb24gZW50cmUgbGVzIHRheG9ucyB5IHNvbnQgaW5kaXF1w6llcyBkYW5zIGxhIHBvcnRpb24gaW5mw6lyaWV1cmUgZ2F1Y2hlIGRlIGxhIGZpZ3VyZS4gQ2V0dGUgbWF0cmljZSBpbGx1c3RyZSDDqWdhbGVtZW50IGxhIHByb3BvcnRpb24gZGUgdmFsZXVycyBkJ2Fib25kYW5jZXMgbm9uIMOpZ2FsZXMgw6AgMCBxdWUgcHLDqXNlbnRlIHVuIHRheG9uIHBhciByYXBwb3J0IMOgIHRvdXRlcyBsZXMgdmFsZXVycyBkJ2Fib25kYW5jZXMgb2JzZXJ2w6llcyBkYW5zIGNlIGRlcm5pZXIuIFNldWxlbWVudCBsZXMgdGF4b25zIHByw6lzZW50cyBkYW5zIHBsdXMgZGUgMjUlIGRlcyB2aXNpdGVzIHkgc29udCByZXByw6lzZW50w6lzLiANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojTWF0cmljZSBkZSBjb3Jyw6lsYXRpb24gZGUgUGVhcnNvbiBnbG9iYWxlIC0gdGF4b25zIGF2ZWMgZnLDqXF1ZW5jZSA+IDI1JQ0KDQpjb3JyZ3JhbShCZW50aG9zMjUsIG9yZGVyID0gRkFMU0UsIGxvd2VyLnBhbmVsID0gcGFuZWwuY29yLCB1cHBlci5wYW5lbCA9IHBhbmVsLnBpZSwgdGV4dC5wYW5lbCA9IHBhbmVsLnR4dCwgbWFpbj1wYXN0ZSgiQ292YXJpYW5jZSBkZSBsJ29jY3VycmVuY2UgZGVzIHRheG9ucyAtIHRheG9ucyBhdmVjIGZyw6lxdWVuY2UgPiIsIEZyZXFNaW4sICIlIikpDQoNCmBgYA0KDQoNCg0KIyMjQWJvbmRhbmNlIGRlcyB0YXhvbnMgZGFucyBsZSB0ZW1wcw0KDQpJbCBwZXV0IMOqdHJlIGludMOpcmVzc2FudCBkJ2V4YW1pbmVyIGwnw6l2YWx1dGlvbiBkZSBsJ2Fib25kYW5jZSBkZXMgdGF4b25zIGRhbnMgbGUgdGVtcHMgYWZpbiBkJ29ic2VydmVyIGRlcyBkeW5hbWlxdWVzIG91IGRlcyBjaGFuZ2VtZW50cyBhYnJ1dGVzLg0KDQpQb3VyIGNoYXF1ZSB0YXhvbiwgbGUgcHJlbWllciBncmFwaGlxdWUgKGVuIGhhdXQgw6AgZ2F1Y2hlKSBpbGx1c3RyZSBsYSB2YWxldXIgZCdhYm9uZGFuY2UgZGVzIGRvbm7DqWVzIHNlbG9uIGxldXIgYW5uw6llIGQnw6ljaGFudGlsbG9ubmFnZS4gTGUgZGV1eGnDqG1lIGdyYXBoaXF1ZSAoZW4gaGF1dCDDoCBkcm9pdGUpIGlsbHVzdHJlIGxlcyB0ZW5kYW5jZXMgb2JzZXJ2w6llcyBkZSB2YXJpYXRpb25zIGRlcyBhYm9uZGFuY2VzIGVuIGluZGl2aWR1cyBkYW5zIGxlIHRlbXBzLiBMZSB0cm9pc2nDqG1lIGdyYXBoaXF1ZSAoZW4gYmFzIMOgIGdhdWNoZSkgaWxsdXN0cmUgbGVzIHByw6l2aXNpb25zIGZ1dHVyZXMgZGUgdmFyaWF0aW9ucyBkZXMgYWJvbmRhbmNlcyBlbiBpbmRpdmlkdXMgZGFucyBsZSB0ZW1wcy4gU3VyIGNlIGdyYXBoaXF1ZSBsYSBsaWduZSBibGV1ZSBjb3JyZXNwb25kIMOgIGxhIHRlbmRhbmNlIGF0dGVuZHVlIG1veWVubmUgZGUgdmFyaWF0aW9ucyBkYW5zIGxlIHRlbXBzLCBsYSB6b25lIGdyaXNlIGZvbmPDqWUgY29ycmVzcG9uZCDDoCB1biBpbnRlcnZhbGxlIGRlIGNvbmZpYW5jZSBkZSA4MCUgZXQgbGEgem9uZSBncmlzZSBww6JsZSBjb3JyZXNwb25kIMOgIHVuIGludGVydmFsbGUgZGUgY29uZmlhbmNlIGRlIDk1JS4gTGUgcXVhdHJpw6htZSBncmFwaGlxdWUgKGVuIGJhcyDDoCBkcm9pdGUpIGlsbHVzdHJlIGwnYXV0b2NvcnLDqWxhdGlvbiBkZSBzw6lyaWVzIHRlbXBvcmVsbGVzIChBQ0YpLiBVbmUgdmFsZXVyIGQnYXV0b2NvcnLDqWxhdGlvbiAgc3Vww6lyaWV1cmUgw6AgbCdpbnRlcnZhbGxlIGRlIGNvbmZpYW5jZSBkZSA5NSUgaWxsdXN0csOpZSBwYXIgbGEgbGlnbmUgcG9pbnRpbGzDqWUgaW5kaXF1ZSB1bmUgcG9zc2libGUgZMOpcGVuZGFuY2UgZW50cmUgbGEgdmFyaWFibGUgZXQgbGEgcMOpcmlvZGUgZGUgbCdhbm7DqWUgKHRlbXBzKS4gUGFyIGV4ZW1wbGUsIHVuZSBjZXJ0YWluZSB2YWxldXIgZCdhYm9uZGFuY2UgZCd1biB0YXhvbiBvYnNlcnbDqWUgbG9ycyBkJ3VuZSBhbm7DqWUgcHLDqWNpc2UgcG91cnJhaXQgw6p0cmUgZXhwbGlxdcOpZSBwYXIgdW4gY2VydGFpbiDDqXbDqW5lbWVudCBkYXRhbnQgZCd1bmUgYW5uw6llIGFudMOpcmlldXJlIChkw6ljYWxhZ2UgZGFucyBsZSB0ZW1wcyBlbiBhbm7DqWVzKS4gSWwgZXN0IMOgIG5vdGVyIHF1ZSBsJ2F1dG9jb3Jyw6lsYXRpb24gYXUgdGVtcHMgZGUgZMOpY2FsYWdlIDAgZXN0LCBwYXIgZMOpZmluaXRpb24sIMOpZ2FsZSDDoCAxLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNJbmTDqXBlbmRhbmNlIHRlbXBvcmVsbGUgZGVzIHRheG9ucw0KDQpkYXRhc2V0LkJJTzIgPC0gbGVmdF9qb2luKGRhdGFzZXQuQklPMiwgZGF0YXNldC5OQU0yWyxjKCJyb3duYW1lcyIsICJTYW1wbGVEYXRlIildLCBieSA9ICJyb3duYW1lcyIpDQoNCmRhdGFzZXQuQklPMltpcy5uYShkYXRhc2V0LkJJTzIpXSA8LSAwDQoNCmZvcihpIGluIDI6KG5jb2woZGF0YXNldC5CSU8yKS01KSl7DQogIHBhcihtZnJvdyA9IGMoMiwgMiksIG1hciA9IGMoNCw0LDQsMSkpDQogIGdyYXBoLnRpbWUgPC0gcGxvdChkYXRhc2V0LkJJTzIkU2FtcGxlRGF0ZSwgZGF0YXNldC5CSU8yWyxpXSwgeGxhYiA9ICJBbm7DqWUiLCB5bGFiID0gIkFib25kYW5jZSIsIG1haW4gPSBwYXN0ZSgiQWJvbmRhbmNlIHRlbXBvcmVsbGUgZGVcbiIsIGNvbG5hbWVzKGRhdGFzZXQuQklPMltpXSkpKQ0KDQogIGdyYXBoLnRpbWUyIDwtIHRzKGRhdGFzZXQuQklPMlssaV0sIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAwNS0wMS0wMSksIGVuZCA9IGMoMjAxNi0wMS0wMSkpDQogIHBsb3QoZ3JhcGgudGltZTIsIHhsYWIgPSAiQW5uw6llIiwgeWxhYiA9ICJBYm9uZGFuY2UiLCBtYWluID0gcGFzdGUoIlByw6l2aXNpb24gZGUgbCdhYm9uZGFuY2UgZGVcbiIsIGNvbG5hbWVzKGRhdGFzZXQuQklPMltpXSkpKQ0KDQogIGF1dG8uYXJpbWEgPC0gYXV0by5hcmltYShncmFwaC50aW1lMikNCiAgZ3JhcGguYXV0by5hcmltYSA8LSBwbG90KGZvcmVjYXN0KGF1dG8uYXJpbWEsIGggPSAxMjApKQ0KICANCiAgZ3JhcGgubGFnIDwtIGFjZihncmFwaC50aW1lMiwgeGxhYiA9ICJEw6ljYWxhZ2UgKGFubsOpZXMpIiwgeWxhYiA9ICJBYm9uZGFuY2UiLCBtYWluID0gcGFzdGUoIkFDRiBkZSIsIGNvbG5hbWVzKGRhdGFzZXQuQklPMltpXSkpLCB5bGltID0gYygwLCAxKSkNCn0NCg0KZGF0YXNldC5CSU8yW2RhdGFzZXQuQklPMiA9PSAwXSA8LSBOQQ0KDQpgYGANCg0KTGVzIHLDqXN1bHRhdHMgc3VpdmFudHMgcHLDqXNlbnRlbnQgbGUgY2FsY3VsIGR1IHRlc3QgZGUgbGEgc3RhdGlzdGlxdWUgZGUgQm94LUxqdW5nIGFwcGxpcXXDqSBzdXIgY2hhcXVlIHRheG9uIGV0IHNvbnQgY29tcGzDqW1lbnRhaXJlcyBhdXggcsOpc3VsdGF0cyBpbGx1c3Ryw6lzIHBhciBsZXMgZ3JhcGhpcXVlcyBwcsOpY8OpZGVudHMuIFVuZSB2YWxldXIgZGUgUCAocC12YWx1ZSkgaW5mw6lyaWV1cmUgw6AgMC4wNSBpbmRpcXVlIHF1ZSBsZXMgdmFsZXVycyByw6lzaWR1ZWxsZXMgZCd1bmUgdmFyaWFibGUgZMOpcGVuZGVudCBkZSBsYSBww6lyaW9kZSBkZSBsJ2FubsOpZSAodGVtcHMpLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNJbmTDqXBlbmRhbmNlIHRlbXBvcmVsbGUgZGVzIHRheG9ucyAoc3VpdGUpDQoNCmRhdGFzZXQuQklPMltpcy5uYShkYXRhc2V0LkJJTzIpXSA8LSAwDQoNCmZvcihpIGluIDI6KG5jb2woZGF0YXNldC5CSU8yKS01KSl7DQogIGdyYXBoLnRpbWUyIDwtIHRzKGRhdGFzZXQuQklPMlssaV0sIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAwNS0wMS0wMSksIGVuZCA9IGMoMjAxNi0wMS0wMSkpDQogIGF1dG8uYXJpbWEgPC0gYXV0by5hcmltYShncmFwaC50aW1lMikNCiAgYm94IDwtIGxhcHBseSgxOjIwLCBmdW5jdGlvbihqKSBCb3gudGVzdCAocmVzaWQoYXV0by5hcmltYSksIGxhZyA9IGosIHR5cGU9IkxqdW5nIikpDQogIHByaW50KHBhc3RlKGNvbG5hbWVzKGRhdGFzZXQuQklPMltpXSkpKSAgDQogIHByaW50KGJveCkNCn0NCg0KZGF0YXNldC5CSU8yW2RhdGFzZXQuQklPMiA9PSAwXSA8LSBOQQ0KDQpgYGANCg0KDQojIyNDb3Jyw6lsYXRpb24gc3BhdGlhbGUgZGVzIHRheG9ucw0KDQpMZXMgcsOpc3VsdGF0cyBzdWl2YW50cyBwcsOpc2VudGVudCBsZXMgcsOpc3VsdGF0cyBkJ2F1dG9jb3Jyw6lsYXRpb24gc3BhdGlhbGUgYXBwbGlxdcOpZSBzdXIgY2hhcXVlIHZhcmlhYmxlLiBVbmUgdmFsZXVyIGRlIFAgKHAtdmFsdWUpIGluZsOpcmlldXJlIMOgIDAuMDUgcGVybWV0IGRlIHN1cHBvc2VyIHF1ZSBsYSBkaXN0cmlidXRpb24gc3BhdGlhbGUgZGVzIHZhbGV1cnMgZm9udCBsJ29iamV0IGQndW5lIGFncsOpZ2F0aW9uIHNwYXRpYWxlIG5vbiBhbMOpYXRvaXJlLiBMb3JzcXVlIGxhIHZhbGV1ciBkZSBQIChwLXZhbHVlKSBlc3QgaW5mw6lyaWV1cmUgw6AgMC4wNSwgdW4gaW5kaWNlIGRlIE1vcmFuIChJIGRlIE1vcmFuIEkpIHBvc2l0aWYgaW5kaXF1ZSBxdWUgbGVzIHZhbGV1cnMgc29udCBhZ2dyw6lnw6lzIGVudHJlIGVsbGVzIHRhbmRpcyBxdSd1biBpbmRpY2UgZGUgTW9yYW4gbsOpZ2F0aWYgaW5kaXF1ZSBxdWUgbGVzIHZhbGV1cnMgc29udCBkaXNwZXJzw6llcyBlbnRyZSBlbGxlcy4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyNJbmTDqXBlbmRhbmNlIHNwYXRpYWxlIGRlcyB0YXhvbnMNCg0KZGF0YXNldC5CSU8yW2lzLm5hKGRhdGFzZXQuQklPMildIDwtIDANCg0KYmlvLmRpc3RzIDwtIGFzLm1hdHJpeChkaXN0KGNiaW5kKGRhdGFzZXQuQklPMiRMYXRpdHVkZSwgZGF0YXNldC5CSU8yJExvbmdpdHVkZSkpKQ0KYmlvLmRpc3RzLmludiA8LSAxL2Jpby5kaXN0cw0KZGlhZyhiaW8uZGlzdHMuaW52KSA8LSAwDQpiaW8uZGlzdHMuaW52W2lzLmluZmluaXRlKGJpby5kaXN0cy5pbnYpXSA8LSAwDQpsdyA8LSBtYXQybGlzdHcoYmlvLmRpc3RzLmludikNCmx3VyA8LSBuYjJsaXN0dyhsdyRuZWlnaGJvdXJzLCBnbGlzdD1sdyR3ZWlnaHRzLCBzdHlsZT0iVyIpDQoNCmZvcihqIGluIDI6KG5jb2woZGF0YXNldC5CSU8yKS01KSl7DQpwcmludChwYXN0ZShjb2xuYW1lcyhkYXRhc2V0LkJJTzJbal0pKSkNCm1vcmFuLnRlc3QgPC0gbW9yYW4udGVzdChkYXRhc2V0LkJJTzJbLGpdLCBsd1csIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiKSANCnByaW50KG1vcmFuLnRlc3QpDQp9DQoNCmRhdGFzZXQuQklPMltkYXRhc2V0LkJJTzIgPT0gMF0gPC0gTkENCg0KYGBgDQoNCg0KIyNEaXZlcnNpdMOpDQoNCiMjI1RhYmxlYXUgZGVzIGluZGljZXMgZGUgZGl2ZXJzaXTDqSBlbiB0YXhvbnMNCg0KTGUgdGFibGVhdSBzdWl2YW50IHByw6lzZW50ZSBsZSBjYWxjdWwgZGUgcGx1c2lldXJzIGluZGljZXMgZGUgZGl2ZXJzaXTDqSBlbiB0YXhvbnMgY2FsY3Vsw6lzIHBvdXIgY2hhcXVlIHZpc2l0ZS4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI1RhYmxlYXUgZGVzIGluZGljZXMgZGUgZGl2ZXJzaXTDqSBlbiB0YXhvbnMNCg0KI1JpY2hlc3NlIGVuIHRheG9ucw0KTjAgPC0gcm93U3VtcyhkYXRhc2V0LkJJTyA+IDAsIG5hLnJtID0gVFJVRSkNCg0KI0VudHJvcGllIGRlIFNoYW5ub24NCmRhdGFzZXQuQklPW2lzLm5hKGRhdGFzZXQuQklPKV0gPC0gMA0KSCA8LSBkaXZlcnNpdHkoZGF0YXNldC5CSU8pDQoNCiNEaXZlcnNpdMOpIGRlIFNoYW5ub24gKG5vbWJyZSBkZSB0YXhvbnMgYWJvbmRhbnRzIGVmZmVjdGlmKQ0KTjEgPC0gZXhwKEgpDQoNCiNEaXZlcnNpdMOpIGRlIFNpbXBzb24gKG5vbWJyZSBkZSB0YXhvbnMgZG9taW5hbnRzIGVmZmVjdGlmKQ0KTjIgPC0gZGl2ZXJzaXR5KGRhdGFzZXQuQklPLCAiaW52IikNCg0KI1LDqWd1bGFyaXTDqSBkZSBQaWVsb3UNCkogPC0gSC9sb2coTjApDQoNCiNJbmRpY2UgZGUgcsOpZ3VsYXJpdMOpIGRlIFNoYW5ub24gKEhpbGwncyByYXRpbykNCkUxMCA8LSBOMS9OMA0KDQojSW5kaWNlIGRlIHLDqWd1bGFyaXTDqSBkZSBTaW1wc29uIChIaWxsJ3MgcmF0aW8pDQpFMjAgPC0gTjIvTjANCg0KI1RhYmxlYXUgZGUgbGEgZGl2ZXJzaXTDqSBlbiB0YXhvbnMNCiMoZGl2IDwtIGRhdGEuZnJhbWUoTjAsIEgsIE4xLCBOMiwgRTEwLCBFMjAsIEopKQ0KZGF0YXNldC5CSU9bZGF0YXNldC5CSU8gPT0gMF0gPC0gTkENCg0KZGl2IDwtIGRhdGEuZnJhbWUoTjAsIEgsIE4xLCBOMiwgSiwgRTEwLCBFMjApDQpkaXYgPC0gcm93bmFtZXNfdG9fY29sdW1uKGRpdiwgdmFyID0gInJvd25hbWVzIikNCmRpdiA8LSBsZWZ0X2pvaW4oZGl2LCBkYXRhc2V0Lk5BTTJbLGMoInJvd25hbWVzIiwgIlNpdGVfRGF0ZV9OdW1iZXIiKV0sIGJ5ID0gInJvd25hbWVzIikNCmRpdiRyb3duYW1lcyA8LSBOVUxMDQoNCntkaXYgPC0gZGl2WywgYyg4LDEsMiwzLDQsNSw2LDcpXQ0KI2Rpdg0KbmFtZXMoZGl2KVsxXSA8LSAiU2l0ZV9EYXRlX05iIGQnw6ljaGFudC4iDQpuYW1lcyhkaXYpWzJdIDwtICJSaWNoZXNzZSBlbiB0YXhvbnMiDQpuYW1lcyhkaXYpWzNdIDwtICJFbnRyb3BpZSBkZSBTaGFubm9uIg0KbmFtZXMoZGl2KVs0XSA8LSAiRGl2ZXJzaXTDqSBkZSBTaGFubm9uIg0KbmFtZXMoZGl2KVs1XSA8LSAiRGl2ZXJzaXTDqSBkZSBTaW1wc29uIg0KbmFtZXMoZGl2KVs2XSA8LSAiUsOpZ3VsYXJpdMOpIGRlIFBpZWxvdSINCm5hbWVzKGRpdilbN10gPC0gIkluZGljZSBkZSBTaGFubm9uIg0KbmFtZXMoZGl2KVs4XSA8LSAiSW5kaWNlIGRlIFNpbXBzb24iDQp9DQoNCmZvcm1hdHRhYmxlKGRpdiwgZGlnaXRzID0gMywgYWxpZ24gPSAiYyIpDQoNCnJtKGRhdGFzZXQuTkFNMikNCmBgYA0KDQoNCiMjI0hpc3RvZ3JhbW1lcyBkZSBsJ29jY3VycmVuY2UgZGUgbGEgZGl2ZXJzaXTDqQ0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI0hpc3RvZ3JhbW1lcyBkZSBsJ29jY3VycmVuY2UgZGUgbGEgZGl2ZXJzaXTDqSBkZSBTaGFubm9uDQoNCiNOMQ0KI3ByaW50KCJPcmRyZSBjcm9pc3NhbnQgZGVzIG9jY3VycmVuY2VzIGRlIGxhIGRpdmVyc2l0w6kgZGUgU2hhbm5vbiIpDQojcm91bmQoc29ydChOMSksIDEpDQpOMS5tZWFuIDwtIG1lYW4oTjEpDQpOMS5zZCA8LSBzZChOMSkNCg0KTjEubiA8LSBsZW5ndGgod2hpY2goIWlzLm5hKE4xKSkpDQoNCk4xLmJpbiA8LSBjZWlsaW5nKChtYXgoTjEpLSBtaW4oTjEpKS9uY2xhc3MuU3R1cmdlcyhOMSkpDQoNCmdyYXBoLk4xLjEgPC0gcXBsb3QoTjEsDQogICAgICBnZW9tID0gImhpc3RvZ3JhbSIsDQogICAgICBiaW53aWR0aCA9IE4xLmJpbiwNCiAgICAgIHhsYWIgPSAiRGl2ZXJzaXTDqSBkZSBTaGFubm9uIiwNCiAgICAgIHlsYWIgPSAiT2NjdXJyZW5jZSIsDQogICAgICBtYWluID0gIk9jY3VycmVuY2VzIGRlIGxhIGRpdmVyc2l0w6kgZGUgXG5TaGFubm9uIiwNCiAgICAgIGZpbGwgPSBJKCdsaWdodHN0ZWVsYmx1ZTEnKSwNCiAgICAgIGNvbG9yID0gSSgnYmxhY2snKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gTjEubWVhbiwNCiAgICAgICAgICAgICAgY29sb3IgPSAnYmx1ZTMnLCBzaXplID0gMSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKE4xLm1lYW4gKyBOMS5zZCwgTjEubWVhbiAtIE4xLnNkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICdibHVlMycsIA0KICAgICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gMikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGZ1bmN0aW9uKHgsIG1lYW4sIHNkLCBuLCBidyl7DQogICAgbiAqIGJ3ICogZG5vcm0oeCA9IHgsIG1lYW4gPSBtZWFuLCBzZCA9IHNkKX0sDQogICAgYXJncyA9IGxpc3QobWVhbiA9IE4xLm1lYW4sIHNkID0gTjEuc2QsIG4gPSBOMS5uLCBidyA9IE4xLmJpbiksDQogICAgbHdkID0gMSwNCiAgICBjb2wgPSAncmVkJykNCg0KZ3JhcGguTjEuMiA8LSBxcGxvdChOMSwNCiAgICAgIGdlb20gPSAiaGlzdG9ncmFtIiwNCiAgICAgIGJpbndpZHRoID0gTjEuYmluLA0KICAgICAgeGxhYiA9ICJEaXZlcnNpdMOpIGRlIFNoYW5ub24iLA0KICAgICAgeWxhYiA9ICJMb2coT2NjdXJyZW5jZSkiLA0KICAgICAgbWFpbiA9ICJPY2N1cnJlbmNlcyBkZSBsYSBkaXZlcnNpdMOpIGRlIFxuU2hhbm5vbiIsDQogICAgICBmaWxsID0gSSgnbGlnaHRzdGVlbGJsdWUxJyksDQogICAgICBjb2xvciA9IEkoJ2JsYWNrJyksDQogICAgICBsb2cgPSAieSIpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IE4xLm1lYW4sDQogICAgICAgICAgICAgIGNvbG9yID0gJ2JsdWUzJywgc2l6ZSA9IDEpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyhOMS5tZWFuICsgTjEuc2QsIE4xLm1lYW4gLSBOMS5zZCksDQogICAgICAgICAgICAgY29sb3IgPSAnYmx1ZTMnLCANCiAgICAgICAgICAgICBzaXplID0gMSwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9IDIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgbiwgYncpew0KICAgIG4gKiBidyAqIGRub3JtKHggPSB4LCBtZWFuID0gbWVhbiwgc2QgPSBzZCl9LA0KICAgIGFyZ3MgPSBsaXN0KG1lYW4gPSBOMS5tZWFuLCBzZCA9IE4xLnNkLCBuID0gTjEubiwgYncgPSBOMS5iaW4pLA0KICAgIGx3ZCA9IDEsDQogICAgY29sID0gJ3JlZCcpDQoNCmdyaWQuYXJyYW5nZShncmFwaC5OMS4xLCBncmFwaC5OMS4yLCBuY29sID0gMikNCg0KDQojSGlzdG9ncmFtbWVzIGRlIGwnb2NjdXJyZW5jZSBkZSBsYSBkaXZlcnNpdMOpIGRlIFNpbXBzb24NCg0KI04yDQojcHJpbnQoIk9yZHJlIGNyb2lzc2FudCBkZXMgb2NjdXJyZW5jZXMgZGUgbGEgZGl2ZXJzaXTDqSBkZSBTaW1wc29uIikNCiNyb3VuZChzb3J0KE4yKSwgMSkNCk4yLm1lYW4gPC0gbWVhbihOMikNCk4yLnNkIDwtIHNkKE4yKQ0KDQpOMi5uIDwtIGxlbmd0aCh3aGljaCghaXMubmEoTjIpKSkNCg0KTjIuYmluIDwtIGNlaWxpbmcoKG1heChOMiktIG1pbihOMikpL25jbGFzcy5TdHVyZ2VzKE4yKSkNCg0KZ3JhcGguTjIuMSA8LSBxcGxvdChOMiwNCiAgICAgIGdlb20gPSAiaGlzdG9ncmFtIiwNCiAgICAgIGJpbndpZHRoID0gTjIuYmluLA0KICAgICAgeGxhYiA9ICJEaXZlcnNpdMOpIGRlIFNpbXBzb24iLA0KICAgICAgeWxhYiA9ICJPY2N1cnJlbmNlIiwNCiAgICAgIG1haW4gPSAiT2NjdXJyZW5jZXMgZGUgbGEgZGl2ZXJzaXTDqSBkZSBcblNpbXBzb24iLA0KICAgICAgZmlsbCA9IEkoJ2xpZ2h0c3RlZWxibHVlMScpLA0KICAgICAgY29sb3IgPSBJKCdibGFjaycpKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBOMi5tZWFuLA0KICAgICAgICAgICAgICBjb2xvciA9ICdibHVlMycsIHNpemUgPSAxKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoTjIubWVhbiArIE4yLnNkLCBOMi5tZWFuIC0gTjIuc2QpLA0KICAgICAgICAgICAgIGNvbG9yID0gJ2JsdWUzJywgDQogICAgICAgICAgICAgc2l6ZSA9IDEsDQogICAgICAgICAgICAgbGluZXR5cGUgPSAyKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QsIG4sIGJ3KXsNCiAgICBuICogYncgKiBkbm9ybSh4ID0geCwgbWVhbiA9IG1lYW4sIHNkID0gc2QpfSwNCiAgICBhcmdzID0gbGlzdChtZWFuID0gTjIubWVhbiwgc2QgPSBOMi5zZCwgbiA9IE4yLm4sIGJ3ID0gTjIuYmluKSwNCiAgICBsd2QgPSAxLA0KICAgIGNvbCA9ICdyZWQnKQ0KDQpncmFwaC5OMi4yIDwtIHFwbG90KE4yLA0KICAgICAgZ2VvbSA9ICJoaXN0b2dyYW0iLA0KICAgICAgYmlud2lkdGggPSBOMi5iaW4sDQogICAgICB4bGFiID0gIkRpdmVyc2l0w6kgZGUgU2ltcHNvbiIsDQogICAgICB5bGFiID0gIkxvZyhPY2N1cnJlbmNlKSIsDQogICAgICBtYWluID0gIk9jY3VycmVuY2VzIGRlIGxhIGRpdmVyc2l0w6kgZGUgXG5TaW1wc29uIiwNCiAgICAgIGZpbGwgPSBJKCdsaWdodHN0ZWVsYmx1ZTEnKSwNCiAgICAgIGNvbG9yID0gSSgnYmxhY2snKSwNCiAgICAgIGxvZyA9ICJ5IikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gTjIubWVhbiwNCiAgICAgICAgICAgICAgY29sb3IgPSAnYmx1ZTMnLCBzaXplID0gMSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKE4yLm1lYW4gKyBOMi5zZCwgTjIubWVhbiAtIE4yLnNkKSwNCiAgICAgICAgICAgICBjb2xvciA9ICdibHVlMycsIA0KICAgICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gMikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGZ1bmN0aW9uKHgsIG1lYW4sIHNkLCBuLCBidyl7DQogICAgbiAqIGJ3ICogZG5vcm0oeCA9IHgsIG1lYW4gPSBtZWFuLCBzZCA9IHNkKX0sDQogICAgYXJncyA9IGxpc3QobWVhbiA9IE4yLm1lYW4sIHNkID0gTjIuc2QsIG4gPSBOMi5uLCBidyA9IE4yLmJpbiksDQogICAgbHdkID0gMSwNCiAgICBjb2wgPSAncmVkJykNCg0KZ3JpZC5hcnJhbmdlKGdyYXBoLk4yLjEsIGdyYXBoLk4yLjIsIG5jb2wgPSAyKQ0KDQpgYGANCg0KDQoNCiMjTm90ZXMgc3VyIGxlcyB2ZXJzaW9ucw0KKipRdW9pIGRlIG5vdXZlYXUsIG1pcyDDoCBqb3VyIG91IGNvcnJpZ8OpIGRhbnMgY2V0dGUgdmVyc2lvbioqDQoNCioqKg0KIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2xvZ29fbmV3LnBuZykgTm91dmVhdSAmbmJzcDsmbmJzcDsmbmJzcDsgICAhW0FDVElPTjpdKC4uLy4uLy4uL0NvbmZpZ3VyYXRpb24vbG9nb191cGRhdGVkLnBuZykgTWlzZSDDoCBqb3VyICZuYnNwOyZuYnNwOyZuYnNwOyAgIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2xvZ29fZml4ZWQucG5nKSBDb3JyaWfDqQ0KDQoqKioNCg0KKipSQ0JBX3Z2X2Jpb2xvZ2lxdWUuUm1kIFZlcnNpb24gMS4xIOKAlCAxNCBmw6l2cmllciAyMDE3KioNCg0KIVtBQ1RJT046XSguLi8uLi8uLi9Db25maWd1cmF0aW9uL2xvZ29fbmV3LnBuZykgICAqKk1pc2Ugw6Agam91cioqIC0tLSBSw6lkdWlyZSBsZSBub21icmUgZGUgcHJvY8OpZHVyZXMgZXQgbW9kaWZpZXIgbGV1ciBvcmdhbmlzYXRpb24uDQoNCioqUkNCQV92dl9iaW9sb2dpcXVlLlJtZCBWZXJzaW9uIDEuMCDigJQgMTggYW/Du3QgMjAxNyoqDQoNCiFbQUNUSU9OOl0oLi4vLi4vLi4vQ29uZmlndXJhdGlvbi9sb2dvX25ldy5wbmcpICAgKipQcmVtacOocmUgdmVyc2lvbioqLg0KDQoNCioqKg0KDQpEw6l2ZWxvcHDDqSBwYXIgW01hcnRpbiBKZWFuXShtYWlsdG86bWFydGluLmplYW5AY2FuYWRhLmNhKSBldCBFdmVseW5lIFBhcXVldHRlLUJvaXNjbGFpcg0KDQoNCg==